zoukankan      html  css  js  c++  java
  • 23种设计模式(3)

    1、定义

    将一个复杂对象的创建和他的表示分离,使用同样的创建过程可以创建不同的表示(类的不同属性的实例)。

    2、UML 图

    8fHV6x.png

    3、组成

    • 产品类(Product):一般是比较复杂的类,即创建该类实例的过程比较复杂
    • 抽象创建者类(IProductBuilder):创建者的抽象接口类,定义了创建对象的步骤,不同的产品创建类可以实现该接口,设计自己的实现
    • 创建者(ProductABuilder、ProductBBuilder):负责创建具体的对象实例,封装了创建类的过程。一般有两步分组成,分别是 创建产品的步骤,和返回创建好的对象
    • 导演类(Director):负责调用适当的创建者来创建产品,一般直接和创建者交互,不会直接和产品类交互

    4、代码

    // 复杂的对象,产品类
    public class Product {
        private List<String> parts = new ArrayList<>();
    
      	// 需要添加多个组件才能创建产品
        public void addPart(String part) {
            this.parts.add(part);
        }
    
        public void show() {
            System.out.println("本产品所有组件有:" + parts.toString());
        }
    }
    
    // 抽象创建者
    public interface IProductBuilder {
      	// 创建步骤
        void buildPart1();
        void buildPart2();
    		// 获得创建好的产品
        Product getProduct();
    }
    
    // A产品的创建者
    public class ProductABuilder implements IProductBuilder {
        private Product product = new Product();
    
        // 创建A产品的步骤1
        @Override
        public void buildPart1() {
            product.addPart("产品A-部件1");
        }
    
        // 创建A产品的步骤2
        @Override
        public void buildPart2() {
            product.addPart("产品A-部件2");
        }
    
        @Override
        public Product getProduct() {
            return product;
        }
    }
    
    // B产品的创建者
    public class ProductBBuilder implements IProductBuilder {
    
        private Product product = new Product();
    
        // 创建产品B的步骤1
        @Override
        public void buildPart1() {
            product.addPart("产品B-部件1");
        }
    
        // 创建产品B的步骤2
        @Override
        public void buildPart2() {
            product.addPart("产品B-部件2");
        }
    
        @Override
        public Product getProduct() {
            return product;
        }
    }
    
    // 导演类,负责调用创建者生成对象
    public class Director {
        public Product getProduct(IProductBuilder builder){
            builder.buildPart1();
            builder.buildPart2();
            return builder.getProduct();
        }
    }
    
    // 调用者
    public class Main {
        public static void main(String[] args) {
            Director director = new Director();
            Product productA = director.getProduct(new ProductABuilder());
            Product productB = director.getProduct(new ProductBBuilder());
    
            productA.show();
            productB.show();
        }
    }
    

    运行结果:

    本产品所有组件有:[产品A-部件1, 产品A-部件2]
    本产品所有组件有:[产品B-部件1, 产品B-部件2]
    

    5、优点

    • 封装性好。将复杂对象的创建过程封装,调用者不需要关心创建的过程
    • 拓展性好。如果有新的产品,只需要增加一个产品创建者,而不用修改已有的代码

    6、和工厂模式的区别

    可以发现,创建者模式和工厂模式很相似,都是用来创建对象实例,区别是 创建者模式多了个 导演类

    与工厂模式相比,创建者模式主要用来创建 比较复杂的对象。因为创建的对象比较复杂,所以需要独立出一个单独的类,即 导演类,来负责这个创建的流程;而工厂类则直接创建对象。

    7、适用场景

    主要用于创建一些比较复杂的对象,这些对象的内部构建顺序通常比较稳定,但是对象构造的 参数/属性 会有区别。所以,如果一个对象的创建比较复杂,使用工厂模式;如果一个对象的创建特别负责,使用创建者模式。

  • 相关阅读:
    (转)堆与堆排序
    Cantor的数表
    Sticks(poj 1011)
    Square(hdu 1511)
    Fire Net(hdu 1045)
    Lake Counting(poj 2386)
    Ants (POJ 1852)
    A + B Problem II 大数加法
    深入理解计算机系统第二版家庭作业2.66
    C++ 队列queque/deque
  • 原文地址:https://www.cnblogs.com/moongeek/p/12549681.html
Copyright © 2011-2022 走看看