写点什么

设计模式示例

用户头像
Mars
关注
发布于: 2020 年 11 月 08 日

单例设计模式

Singleton保证一个类产生一个实例。带来好处:

l  单一实例,减少实例频繁创建和销毁带来的资源销毁。

l  多个用户使用该实例,便于统一控制。

饿汉单例实例特点:

l  构造函数私有;

l  通过私有静态成员变量创建;

l  通过公有静态方法返回该实例对象;

懒汉单例实例特点(性能稍差,推荐饿汉单例模式):

l  构造函数私有;

l  通过私有静态成员变量创建,但为null;

l  通过公有静态方法返回该实例对象,如果实例=null,创建并返回(该方法注意加锁);



下图是饿汉单例模式实现



组合设计模式

组合模式是一种对象的结构模式,用于把一组相似的对象当做一个单一的对象,用来表示部分及整体的关系。

使用场景:描述部分及整体层次结构,例如:树形结构;忽略单个对象和组合对象之间区别,统一使用组合对象中的所有对象。

优点:1.高层调用低层。2.节点自由增肌。

缺点:使用组合模式时,部分和整体的声明都是实现类,非接口,违反依赖倒置。



下面我们使用组合设计模式编写代码,打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考图 3。



1.组件抽象类

public abstract class Component {
protected String name;
public Component(String name) {
this.name = name;
}
public abstract void add(Component component);
public abstract void print();
}



2.容器类

public class Container extends Component{
private List<Component> list = Lists.newArrayList();
public Container(String name) {
super(name);
}
@Override
public void add(Component component) {
this.list.add(component);
}
@Override
public void print() {
System.out.println(name);
list.stream()
.forEach(component -> {
component.print();
});
}
}



3.组件元素类

public class Element extends Component {
public Element(String name) {
super(name);
}
@Override
public void add(Component component) {
}
@Override
public void print() {
System.out.println(name);
}
}



4.main类

public class Client {
public static void main(String[] args) {
Container root = new Container("WinForm(WINDOW窗口)");
Element pic = new Element("Picture(LOGO图片)");
Element loginButton = new Element("Button(登录)");
Element registerButton = new Element("Button(注册)");
root.add(pic);
root.add(loginButton);
root.add(registerButton);
Container frame = new Container("Frame(FRAME1)");
Element labelUsername = new Element("Label(用户名)");
Element textBox1 = new Element("TextBox(文本框)");
Element labelPassword = new Element("Label(密码)");
Element passwordBox = new Element("PasswordBox(密码框)");
Element checkBox = new Element("CheckBox(复选框)");
Element textBox2 = new Element("TextBox(记住用户名)");
Element linkLabel = new Element("LinkLabel(忘记密码)");
frame.add(labelUsername);
frame.add(textBox1);
frame.add(labelPassword);
frame.add(passwordBox);
frame.add(checkBox);
frame.add(textBox2);
frame.add(linkLabel);
root.add(frame);
root.print();
}
}



发布于: 2020 年 11 月 08 日阅读数: 32
用户头像

Mars

关注

还未添加个人签名 2018.06.12 加入

还未添加个人简介

评论

发布
暂无评论
设计模式示例