单例模式与组合模式总结与练习

发布于: 2020 年 06 月 21 日
单例模式与组合模式总结与练习

1. 模式总结

1.1 单例模式

单例模式(Singleton Pattern)顾名思义就是该类有且只有一个实例,并且对外提供可以访问该实例的方法,在23中设计模式中属于创建型模式,它提供了一种创建对象的最佳方式。

单例模式的特点:

  • 单例模式类的构造方法的修饰符为private,即正常情况下不对外提供创建实例的能力

  • 单例模式需要定义一个静态的实例变量,该变量作为应用中的唯一实例存在

  • 单例模式需要对外提供静态访问实例变量的方法(如果把静态实例变量定义public final常量形势的化,我觉得静态访问方法可以省略)

1.2 组合模式

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

组合模式的特点:

  • 将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性

  • 组合模式不容易限制组合中的构件

2. 第三章作业

2.1 作业内容

请用组合设计模式编写模式,打印输出图1的窗口,窗口组件的树结构如图2所示,打印输出实例参考图3.

2.2 示例代码

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

// 元组件抽象类
public abstract class MetaComponent implements Component {
private String name;
public MetaComponent(String name){
this.name = name;
}
public abstract void render();
@Override
public void print() {
System.out.println(this.name);
}
}

import java.util.ArrayList;
import java.util.List;
// 容器组件抽象类
public abstract class Container implements Component {
private List<Component> componentList = new ArrayList<Component>();
private String name = null;
public Container(String name) {
this.name = name;
}
public void addComponent(Component component) {
componentList.add(component);
}
public abstract void render();
@Override
public void print() {
System.out.println(this.name);
componentList.forEach(comp -> comp.print());
}
}

/**
* 叶子节点实现类
* 包括:Button/CheckBox/Lable/LinkLable/PasswordBox/Picture/TextBox
*/
public class Button extends MetaComponent {
public Button(String name) {
super(name);
}
@Override
public void render() {
}
}

/**
* 树干节点实现类
* 包括:WinForm/Frame
*/
public class WinForm extends Container {
public WinForm(String name) {
super(name);
}
@Override
public void render() {
// Window Form Render
}
}

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

2.3 执行结果

2.4 手写单例模式代码

单例模式特点

1. 私有构造方法,使外部不可以使用构造方法创建对象

2. 静态单例对象

3. 对外提供静态访问单例对象方法

用户头像

王友

关注

还未添加个人签名 2018.03.26 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
组合模式作业类结构非常清晰。我要抄你的了。。。
15 小时前
回复
共同学习😄
48 分钟前
回复
没有更多了
单例模式与组合模式总结与练习