架构师训练营 - 第三周 -20200624- 单例模式和组合模式

发布于: 2020 年 06 月 24 日
架构师训练营-第三周-20200624-单例模式和组合模式

1、手写单例模式:

手写的看不太清楚,贴上源码:

public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public synchronized static Singleton getUniqueInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}

关键的点有两个:

  • 双重检查

  • 通过volatile关键字禁止指令重排,防止返回的对象还未进行初始化,造成空指针,虽然这个概率比较小

2、组合模式

组合模式(Composite Pattern),又叫部分整体模式,是将对象组合成树形结构来表现“部分-整体”的层次结构。属于结构型设计模式,它创建了对象组的树形结构,使得客户端可以用一致的方式处理单个对象以及对象的组合。

组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口。这就是组合模式能够将组合对象和简单对象进行一致处理的原因。

组合模式的构成部分:

  • 组合部件(Component):它是一个抽象角色,为要组合的对象提供统一的接口。

  • 叶子(Leaf):在组合中表示子节点对象,叶子节点不能有子节点。

  • 合成部件(Composite):定义有枝节点的行为,用来存储部件,实现在Component接口中的有关操作,如增加(Add)或删除(Remove)。

作业:

具体代码:

// 组件接口定义,组件树中的组件都需实现该接口
public interface Component {
void operation(String printStr);
}

//枝类,相当于容器组件
public class Composite implements Component {
private String name;
private List<Component> childComponents = new ArrayList<>();
public Composite(String name) {
this.name = name;
}
public void operation(final String printStr) {
System.out.println(printStr + " " + name);
if(!CollectionUtils.isEmpty(childComponents)) {
childComponents.forEach(x -> {
x.operation(printStr);
});
}
}
public void addComponent(Component child) {
childComponents.add(child);
}
}

//叶子类
public class Button extends MetaComponent {
public Button(String name) {
super(name);
}
}

public class Frame extends Composite {
public Frame(String name) {
super(name);
}
}

//输出窗口测试类
public class Test {
public static void main(String[] args) {
Composite loginPage = new WinForm("WinForm(WINDOW窗口)");
loginPage.addComponent(new Picture("Picture(LOGO图片)"));
loginPage.addComponent(new Button("Button(登录)"));
loginPage.addComponent(new Button("Button(注册)"));
Composite frame = new Frame("Frame(FRAME1)");
frame.addComponent(new Lable("Lable(用户名)"));
frame.addComponent(new TextBox("TextBox(文本框)"));
frame.addComponent(new Lable("Lable(密码)"));
frame.addComponent(new PasswordBox("PasswordBox(密码框)"));
frame.addComponent(new CheckBox("CheckBox(复选框)"));
frame.addComponent(new TextBox("TextBox(记住用户名)"));
frame.addComponent(new LinkLable("LinkLable(忘记密码)"));
loginPage.addComponent(frame);
loginPage.operation("print");
}
}

最后的输出结果:

总体来说,demo还是很好理解的,关键是如何在自己日常的业务开发中真正运用起来,推荐一位大佬写的设计模式实战系列中的例子:

https://xie.infoq.cn/article/42190edf005afdf1b47d9edeb

发布于: 2020 年 06 月 24 日 阅读数: 12
用户头像

迫于无奈

关注

死亡骑士带你勇闯多多 2018.03.27 加入

人不狠话挺多

评论

发布
暂无评论
架构师训练营-第三周-20200624-单例模式和组合模式