写点什么

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

用户头像
关注
发布于: 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 加入

间歇性自律,持续性懒散,真的很懒!

评论 (3 条评论)

发布
用户头像
写的好
2020 年 06 月 24 日 16:23
回复
用户头像
组合模式作业类结构非常清晰。我要抄你的了。。。
2020 年 06 月 21 日 23:36
回复
共同学习😄
2020 年 06 月 22 日 14:14
回复
没有更多了
单例模式与组合模式总结与练习