• 设计模式生成器模式


    概述

      将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

    适用场景

      1)构建一个复杂对象,该复杂对象内部往往有许多部件(域)待初始化;

      2)通过不同的生成器,就可生成相应的复杂对象;

    结构

      

      1)Product:即产品类。该类很复杂,它包含的域待初始化;

      2)Builder:抽象Builder类。它需要指定Product对象中各部件的生成方法:buildPart();

      3)ConcreteBuilder:Builder类的一个实现。它包含一个待初始化的Product对象,通过对其组件进行初始化,并提供一个成型对象的方法;

      4)Director:建造者。它包含一个抽象Builder对象,通过不同的Builder实现类,可生成不同的Product对象;在此过程中,也可选择性初始化部分组件,很灵活。

    实例:

      Product有2个组件:component1和component2; Builder有2个实现类,生成含有不同组件组合的Product。

    Product:

     1 package org.wgx.pattern.builder;
     2 
     3 public class Product {
     4     private String name = "";
     5     private String component1 = "";
     6     private String component2 = "";
     7     
     8     public Product(String name) {
     9         this.name = name;
    10     }
    11     
    12     public void setName(String name) {
    13         this.name = name;
    14     }
    15     
    16     public void setComponent1(String c1) {
    17         this.component1 = c1;
    18     }
    19     
    20     public void setComponent2(String c2) {
    21         this.component2 = c2;
    22     }
    23     
    24     public String toString() {
    25         String result = "This is Product: " + name + ", component1 is " + component1 + ", component2 is " + component2 + "\r\n";
    26         return result;
    27     }
    28 }

    Builder:

    1 package org.wgx.pattern.builder;
    2 
    3 public interface Builder {
    4     public void buildComponent1();
    5     public void buildComponent2();
    6     public Product getProduct();
    7 }

    ConcreteBuilderOne:

     1 package org.wgx.pattern.builder;
     2 
     3 public class ConcreteBuilderOne implements Builder {
     4     
     5     private Product product;
     6     
     7     public ConcreteBuilderOne() {
     8         product = new Product("first product");
     9     }
    10     
    11     @Override
    12     public void buildComponent1() {
    13         // TODO Auto-generated method stub
    14         this.product.setComponent1("1a");
    15     }
    16 
    17     @Override
    18     public void buildComponent2() {
    19         // TODO Auto-generated method stub
    20         this.product.setComponent2("2a");
    21     }
    22 
    23     @Override
    24     public Product getProduct() {
    25         // TODO Auto-generated method stub
    26         return this.product;
    27     }
    28 
    29 }

    ConcreteBuilderTwo:

     1 package org.wgx.pattern.builder;
     2 
     3 public class ConcreteBuilderTwo implements Builder {
     4 
     5     private Product product;
     6     
     7     public ConcreteBuilderTwo() {
     8         product = new Product("second product");
     9     }
    10         
    11     @Override
    12     public void buildComponent1() {
    13         // TODO Auto-generated method stub
    14         this.product.setComponent1("1b");
    15     }
    16 
    17     @Override
    18     public void buildComponent2() {
    19         // TODO Auto-generated method stub
    20         this.product.setComponent2("2b");
    21     }
    22 
    23     @Override
    24     public Product getProduct() {
    25         // TODO Auto-generated method stub
    26         return this.product;
    27     }
    28 
    29 }

    Director:

     1 package org.wgx.pattern.builder;
     2 
     3 public class Director {
     4     private Builder builder;
     5     
     6     public Director(Builder builder) {
     7         this.builder = builder;
     8     }
     9     
    10     public Product constructProduct() {
    11         builder.buildComponent1();
    12         builder.buildComponent2();
    13         return builder.getProduct();
    14     }
    15     
    16 }

    Client:

     1 package org.wgx.pattern.builder;
     2 
     3 public class Client {
     4 
     5     /**
     6      * @param args
     7      */
     8     public static void main(String[] args) {
     9         // TODO Auto-generated method stub
    10         Builder builder1 = new ConcreteBuilderOne();
    11         Director director1 = new Director(builder1);
    12         System.out.println(director1.constructProduct());
    13             
    14         Builder builder2 = new ConcreteBuilderTwo();
    15         Director director2 = new Director(builder2);
    16         System.out.println(director2.constructProduct());
    17     }
    18 
    19 }

    结果:

    This is Product: first product, component1 is 1a, component2 is 2a

    This is Product: second product, component1 is 1b, component2 is 2b

  • 相关阅读:
    心怀梦想
    一年三篇IF大于7的牛人告诉你怎么写SCI
    保护眼睛,绿豆沙颜色的RGB值和HSL值
    优美的句子
    MATLAB中imshow()和image()
    MATLAB中求矩阵非零元的坐标
    最小二乘法(一维)
    关于论文
    机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent)
    Go语言基础之操作Redis
  • 原文地址:https://www.cnblogs.com/forstudy/p/3085662.html
Copyright © 2020-2023  润新知