Builder模式及原型模式

作者: 某昆 | 来源:发表于2018-09-08 12:11 被阅读24次

    本文主要内容

    • Builder模式定义
    • Builder模式
    • 原型模式定义
    • 原型模式

    本文介绍两种简单的设计模式,Builder模式和原型模式。

    1、Builder模式定义

    Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

    在android中经常能看到各种 Builder,通过 Builder 设置参数,最后生成对象。回顾这些使用场景,基本我们能联想到,如果一个对象要设定的参数特别多,物象比较复杂,则可以使用 Builder 模式。

    Builder 模式UML图

    其中Director是指组装过程。

    2、Builder模式

    Builder模式比较简单,此处直接上代码

    public abstract class Computer {
    
    protected String mBoard;
    protected String mDisplay;
    protected String mOs;
    protected Computer() {
    }
    public void setBoard(String board) {
        this.mBoard = board;
    }
    public void setDisplay(String display) {
        this.mDisplay = display;
    }
    public abstract void setOs();
    @Override
    public String toString() {
        return "computer mBoard = " + mBoard + "  mDisplay = " + mDisplay
                + "  mOs = " + mOs;
    }
    }
    
    public class MacBook extends Computer{
    
    @Override
    public void setOs() {
        mOs = "Mac OS";
    }
    
    protected MacBook(){};
    }
    
    public abstract class Builder {
    
    public abstract void buildBoard(String board);
    
    public abstract void buildDisplay(String display);
    
    public abstract void buildOs();
    
    public abstract Computer create();
    }
    public class MacBookBuilder extends Builder{
    
    private Computer mComputer = new MacBook();
    
    @Override
    public void buildBoard(String board) {
        mComputer.setBoard(board);
    }
    
    @Override
    public void buildDisplay(String display) {
        mComputer.setDisplay(display);
    }
    
    @Override
    public void buildOs() {
        mComputer.setOs();
    }
    
    @Override
    public Computer create() {
        return mComputer;
    }
    
    }
    public class Director {
    
    Builder mBuilder = null;
    
    public Director(Builder builder){
        mBuilder = builder;
    }
    
    public void construct(String board, String display){
        mBuilder.buildBoard(board);
        mBuilder.buildDisplay(display);
        mBuilder.buildOs();
    }
    
    public static void main(String[] args) {
        Builder builder = new MacBookBuilder();
        Director director = new Director(builder);
        director.construct("主板", "显示器");
        System.out.println(builder.create());
    }
    }
    

    3、原型模式定义

    原型模式:用原型实例指定创建对象的各类,并通过拷贝这些原型创新的对象

    原型模式在前文中有见识过一回,ConcurrentHashMap源码解析 一文中提到,ConcurrentHashMap内部存在一个Segment数组,它初始化了索引为0的Segment,数组上的其它元素则以0索引位上的元素为原型创建。

    所以,当类初始化需要消化非常多的资源时,通过原型拷贝可以避免这些消耗,或者像ConcurrentHashMap一样,数组内的元素需要保持一致等情况,都可以使用原型模式。

    原型模式UML图

    4、原型模式

    原型模式目前在我的博文里,其实有两处提及,其一就是上文的 ConcurrentHashMap源码解析 ,另外一处就是 说说深拷贝和浅拷贝

    它最重要的一点就是通过克隆原始对象或者说复制原始对象,生成新对象。有一点非常重要的是,一定要通过深拷贝来生成新对象。浅拷贝生成的新对象,其内部引用对象仍然同原始对象共享,可能产生问题。

    现在我们来回顾下深拷贝的主要两点内容:

    • 原始对象内通过clone方法生成的对象是一个新对象
    • 原始对象内部的引用对象,无法通过clone方法生成新对象。只有基础数据类型和String类型可以生成新对象

    所以深拷贝的核心,就是要在克隆的时候将内部的引用成员变量,手动克隆一次。

    关于原型模式的示例代码,本文不再贴了,可以去 说说深拷贝和浅拷贝 一文查看。

    相关文章

      网友评论

        本文标题:Builder模式及原型模式

        本文链接:https://www.haomeiwen.com/subject/uapkgftx.html