创建型模式之建造者模式

创建型模式之建造者模式

建造者模式分为两个部分,构造和装配,是产品本身与产品创建过程的解耦。
建造者模式中有四种角色,分别是:

  • 抽象建造者类(Buider):规定哪些部件要实现,而不涉及具体实现。

  • 具体建造者类(ConcreteBuilder):实现Buider接口,完成复杂产品的各个部件的具体创建方法,在构造过程完成后,提供产品实例。

  • 产品类(Product):要创建的复杂对象

  • 指挥者类(Director):调用具体建造者创建复杂对象各个部分,在指挥者类中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

     具体建造者类负责构造部件,而指挥者类负责进行装配,生产出产品类。
    

扩展:

一般的类如果参数过多,通过有参方法或者get方法对参数进行赋值很麻烦,并且很容易就混淆参数的顺序,可以通过一种另类的建造者模式进行创建。
采用内部类对方法的参数进行访问与赋值,内部类中进行对属性的装配。

/**
 * 手机类
 */
public class Phone {
    
    
    private String cpu;
    private String screen;
    private String memory;
    private String mainboard;
    // 私有构造方法
    private Phone(Buider buider){
    
    
        this.cpu = buider.cpu;
        this.screen = buider.screen;
        this.memory = buider.memory;
        this.mainboard = buider.mainboard;
    }

    @Override
    public String toString() {
    
    
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", screen='" + screen + '\'' +
                ", memory='" + memory + '\'' +
                ", mainboard='" + mainboard + '\'' +
                '}';
    }

    public static final class Buider{
    
    
        private String cpu;
        private String screen;
        private String memory;
        private String mainboard;

        public Buider cpu(String cpu){
    
    
            this.cpu = cpu;
            return this;
        }

        public Buider screen(String screen){
    
    
            this.screen = screen;
            return this;
        }

        public Buider memory(String memory){
    
    
            this.memory = memory;
            return this;
        }

        public Buider mainboard(String mainboard){
    
    
            this.mainboard = mainboard;
            return this;
        }
        // 使用构建者Phone对象
        public Phone buider(){
    
    
            return new Phone(this);
        }
    }
}

然后就可以采用链式方法进行创建:

		// 创建手机对象 通过构建者对象获取手机对象
        Phone phone = new Phone.Buider()
                .cpu("intel")
                .screen("三星")
                .memory("Kingston")
                .mainboard("华硕")
                .buider();

        System.out.println(phone.toString());

Guess you like

Origin blog.csdn.net/qq_44157349/article/details/119426576