zoukankan      html  css  js  c++  java
  • 设计模式之创建者模式

    http://www.cnblogs.com/lixiuyu/p/5907548.html

    创建者模式

    创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

    创建者模式通常包括如下几种角色:

    1.建造者角色(Builder)

    对复杂对象的创建过程加以抽象,给出一个抽象接口,以规范产品对象的各个组成部分的建造。这个接口规定了要实现复杂对象的哪个部分的创建,但并不涉及具体对象不见的创建。

    2.具体创建者角色(ConcreateBuilder)

    实现Builder接口,针对不同的业务逻辑,具体化复杂对象的各个部分的创建。在建造过程完成后,提供产品的实例。

    3.指导者(Director)

    调用具体建造者来创建复杂对象的各个部分,在指导者中不设计具体产品的信息,只负责保证对象各部分完整创建或者按某种顺序创建。

    4.产品(Product)

    要创建的复杂对象,一般来说包含多个部分。

    下面给出创建者模式的UML图:

    下面我们通过代码体会一下:

    首先我们定义Product类,里面用一个List存储product对象的各个部分:

    复制代码
     1 /**
     2  * Created by ufenqi lixiuyu.
     3  */
     4 public class Product {
     5     private List<String> parts = new ArrayList<String>();
     6 
     7     public void add(String partName){
     8         parts.add(partName);
     9     }
    10 
    11     public void show(){
    12         System.out.println("----产品创建----");
    13         for (String part : parts) {
    14             System.out.println(part);
    15         }
    16     }
    17 }
    复制代码

    然后,我们定义Builder抽象类,并定义Product包括partA,partB,partC三个部分:

    复制代码
    1 public abstract class Builder {
    2     protected abstract void buildPartA();
    3     protected abstract void buildPartB();
    4     protected abstract void buildPartC();
    5 
    6     protected abstract Product getResult();
    7 }
    复制代码

    下面分别定义ConcreateBuilder角色的BuilderA及BuilderB:

    复制代码
     1 public class BuilderA extends Builder {
     2     private Product product = new Product();
     3 
     4     @Override
     5     protected void buildPartA() {
     6         product.add("partA");
     7     }
     8 
     9     @Override
    10     protected void buildPartB() {
    11         product.add("partB");
    12     }
    13 
    14     @Override
    15     protected void buildPartC() {
    16         product.add("partC");
    17     }
    18 
    19     @Override
    20     protected Product getResult() {
    21         return product;
    22     }
    23 }
    复制代码
    复制代码
     1 public class BuilderB extends Builder {
     2     private Product product = new Product();
     3 
     4     @Override
     5     protected void buildPartA() {
     6         product.add("partX");
     7     }
     8 
     9     @Override
    10     protected void buildPartB() {
    11         product.add("partY");
    12     }
    13 
    14     @Override
    15     protected void buildPartC() {
    16         product.add("partZ");
    17     }
    18 
    19     @Override
    20     protected Product getResult() {
    21         return product;
    22     }
    23 }
    复制代码

    下面我们定义指导者角色BuilderDirector,在类中添加Builder的引用,并通过其构造方法初始化builder属性:

    复制代码
     1 public class BuilderDirector {
     2 
     3     private Builder builder = null;
     4 
     5     public BuilderDirector(Builder builder){
     6         this.builder = builder;
     7     }
     8 
     9     public Product build(){
    10         builder.buildPartA();
    11         builder.buildPartB();
    12         builder.buildPartC();
    13         return builder.getResult();
    14     }
    15 
    16 }
    复制代码

    编写测试类:

    复制代码
     1 public class BuilderTest {
     2 
     3     public static void main(String[] args) {
     4 
     5         BuilderDirector director = new BuilderDirector(new BuilderB());
     6         Product product = director.build();
     7         product.show();
     8     }
     9 
    10 }
    复制代码

    运行结果如下:

    ----产品创建----
    partX
    partY
    partZ

    总结:

    1)使用建造者模式的好处:

    ①使用建造者模式可以使客户端不必知道产品内部组成的细节。

    ②具体的建造者类之间是相互独立的,这有利于系统的扩展。

    ③具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生任何影响。

    2)建造者模式的使用场景:

    ①创建一些复杂对象时,这些对象的内部组成部分之间的建造顺序是稳定的,但对象的内部组成构建面临着复杂的变化。

    ②要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。

  • 相关阅读:
    Android Studio 开发
    Jsp编写的页面如何适应手机浏览器页面
    电影
    Oracle 拆分列为多行 Splitting string into multiple rows in Oracle
    sql server 2008 自动备份
    WINGIDE 激活失败
    python安装 错误 “User installations are disabled via policy on the machine”
    ble编程-外设发送数据到中心
    iOS开发-NSString去掉所有换行及空格
    ios9 字符串与UTF-8 互相转换
  • 原文地址:https://www.cnblogs.com/feng9exe/p/7356235.html
Copyright © 2011-2022 走看看