zoukankan      html  css  js  c++  java
  • 设计者模式详解--建造者模式

    1. 概述
      将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。

    2. 建造者模式中的角色

      2.1 建造者(Builder):为创建一个产品对象的各个部件指定抽象接口。
      2.2 具体建造者(ConcreteBuilder):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
      2.3 指挥者(Director):指挥并构造一个使用Builder接口的对象。
      2.4 产品(Product):表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

    3. 实例:创建一个人,这个人可以有不同的特点,可以是胖子,可以是瘦子,可以是高个子,也可以是矮个子。
      3.1 以下是这个实例的类图,以及对类图的解读。

      

      3.2 代码实现及解读:

    1.要建造的具体产品

    package com.hongmoshui.designMode.builder;
    
    public class Product
    {
        private String partA; //可以是任意类型
    
        private String partB;
    
        private String partC;
    
        public String getPartA()
        {
            return partA;
        }
    
        public void setPartA(String partA)
        {
            this.partA = partA;
        }
    
        public String getPartB()
        {
            return partB;
        }
    
        public void setPartB(String partB)
        {
            this.partB = partB;
        }
    
        public String getPartC()
        {
            return partC;
        }
    
        public void setPartC(String partC)
        {
            this.partC = partC;
        }
    
        @Override
        public String toString()
        {
            return "Product [partA=" + partA + ", partB=" + partB + ", partC=" + partC + "]";
        }
    }

    2.抽象建造者与具体建造者【抽象建造者类中定义了产品的创建方法和返回方法;具体建造者类实现了抽象建造者类的抽象接口,构建和装配各个部件】

    package com.hongmoshui.designMode.builder;
    
    public abstract class Builder
    {
        protected Product product = new Product();
    
        public abstract void buildPartA();
    
        public abstract void buildPartB();
    
        public abstract void buildPartC();
    
        public Product getResult()
        {
            return product;
        }
    }
    
    class ConcreteBuilder extends Builder
    {
        public void buildPartA()
        {
            product.setPartA("A产品");
            System.out.println("创建A产品...");
        }
    
        public void buildPartB()
        {
            product.setPartB("B产品");
            System.out.println("创建B产品...");
        }
    
        public void buildPartC()
        {
            product.setPartC("C产品");
            System.out.println("创建C产品...");
        }
    }

    3.指挥者类Director,该类的作用主要有两个:一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程。指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象

    package com.hongmoshui.designMode.builder;
    
    public class Director
    {
        private Builder builder;
    
        //1 构造方法的方式注入builder对象
        public Director(Builder builder)
        {
            this.builder = builder;
        }
    
        //2 set方法注入builder对象
        public void setBuilder(Builder builder)
        {
            this.builder = builder;
        }
    
        public Product construct()
        {
            builder.buildPartA();
            builder.buildPartB();
            builder.buildPartC();
            return builder.getResult();
        }
    }

    4.测试

    package com.hongmoshui.designMode.builder;
    
    public class Test
    {
        public static void main(String[] args)
        {
            Builder builder = new ConcreteBuilder();
            Director director = new Director(builder);
            Product product = director.construct();
            System.out.println(product);
        }
    }

    4. 模式总结

      4.1 优点

        4.1.1 用户只需要指定要建造的类型就可以得到它们,而具体的建造过程和细节不需要知道。
        4.1.2 建造代码与表示相分离,如果要改变一个产品的内部表示,只要再定义一个新的具体的建造者就可以了。
        4.1.3 建造过程由指挥者来控制,建造细节由一个抽象类来控制,对于实现建造细节的具体类来说,不会遗漏某一个步骤。

      4.2 缺点

        以上例子说明,现在我要增加产品的一个细节,如把创建脚的过程也添加进来,看我们需要改哪些类。Buider,FatPersonBuilder,ThinPersonBuilder(甚至更多,如果你实现了TallPersonBuilder,ShortPersonBuilder等),PersonDirector,我们对修改也就开放了。

      4.3 实用范围
        4.3.1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

        4.3.2 当复杂对象的部件相对稳定,不会发生变化时

    原文链接:https://www.cnblogs.com/wangjq/archive/2012/06/27/2561237.html

  • 相关阅读:
    oracle 分配表权限给用户的写法
    任务的一种写法:
    解决oracle 32位64位的问题
    设计模式学习
    Nginx 相关介绍
    (2) html 语义化
    (1)HTML5的常用新特性你必须知道
    less初学手记
    如何修改chrome记住密码后自动填充表单的黄色背景 ?
    HTML的水平居中和垂直居中解决方案
  • 原文地址:https://www.cnblogs.com/hongmoshui/p/10438232.html
Copyright © 2011-2022 走看看