zoukankan      html  css  js  c++  java
  • 建造者(生成器)模式C++、Java实现

    1、建造者模式UML

    图1. 建造者模式UML

    2、C++实现

      C++实现类视图:

    图2. 建造者模式C++实现的类视图

      其中,Product的实现代码是(ProductA和ProductB的代码不再列出):

     1 //产品抽象基类。
     2 //三个属性的先后赋值顺序代表着不同产品的建立。
     3 class Product
     4 {
     5 private:
     6     std::string attribute1;
     7     std::string attribute2;
     8     std::string attribute3;
     9 
    10 public:
    11     Product();
    12     ~Product();
    13 };

      Builder实现代码是:

     1 //建造者抽象基类。
     2 class Builder
     3 {
     4 public:
     5     Builder();
     6     ~Builder();
     7 
     8     //声明的3个为Product的三个属性赋值的函数。
     9     virtual void OperateStep1() = 0;
    10     virtual void OperateStep2() = 0;
    11     virtual void OperateStep3() = 0;
    12 
    13     //返回建立好的Product对象。
    14     virtual Product * GetResult() = 0;
    15 
    16 };

      ConcreteBuilderA的实现代码是:

     1 class ConcreteBuilderA :
     2     public Builder
     3 {
     4 private:
     5     ProductA * pa;
     6 
     7 public:
     8     ConcreteBuilderA() { pa = new ProductA();}
     9     ~ConcreteBuilderA();
    10 
    11     //函数中是赋值语句,可按具体的产品对象的赋值顺序赋值。
    12     void OperateStep1() { pa->setAttribute1(""); }
    13     void OperateStep2() { pa->setAttribute2(""); }
    14     void OperateStep3() { pa->setAttribute3(""); }
    15 
    16     //返回建立好的ProductA对象。
    17     Product * GetResult() { return pa; }
    18 };

      ConcreteBuilderB的实现代码是:

     1 //具体建造者类,建立ProductB的对象,并为ProductB的属性赋值。
     2 class ConcreteBuilderB :
     3     public Builder
     4 {
     5 private:
     6     ProductB * pb;
     7 
     8 public:
     9     ConcreteBuilderB() { pb = new ProductB(); }
    10     ~ConcreteBuilderB();
    11 
    12     //函数中是赋值语句,可按具体的产品对象的赋值顺序赋值。
    13     void OperateStep1() { pb->setAttribute3(""); }
    14     void OperateStep2() { pb->setAttribute2(""); }
    15     void OperateStep3() { pb->setAttribute1(""); }
    16 
    17     //返回建立好的ProductA对象。
    18     Product * GetResult() { return pb; }
    19 
    20 };

      Director的实现代码是:

     1 //建造者模式中的监督类。
     2 //向外提供接口,向内定义建造顺序。
     3 class Director
     4 {
     5 private:
     6     Builder * builder;
     7 
     8 public:
     9     //按得到的不同的对象,进行不同顺序的建造。
    10     Director(Builder &b);
    11     ~Director();
    12 
    13     //具体的监督方法。
    14     Product * GetResult();
    15 };
    16 
    17 
    18 Director::Director(Builder &b)
    19 {
    20     builder = &b;
    21 }
    22 
    23 //方法中的调用顺序固定,建造顺序可在不同的Builder对象设置。
    24 Product * Director::GetResult()
    25 {
    26     builder->OperateStep1();
    27     builder->OperateStep2();
    28     builder->OperateStep3();
    29 
    30     return builder->GetResult();
    31 }//end method GetResult

    3、Java实现

      Java实现的类视图

    图3. 建造者模式的Java实现的类视图

       其中,Product的实现代码是(ProductA和ProductB的代码不再列出):

    1 public class Product {
    2 
    3     private String attribute1;
    4     private String attribute2;
    5     private String attribute3;
    6     
    7 }//end class Product

      Builder的实现代码是:

     1 public abstract class Builder {
     2 
     3     //三个为产品属性赋值的方法。
     4     //三个方法按相应产品必要的顺序赋值。
     5     public abstract void OperateStep1();
     6     public abstract void OperateStep2();
     7     public abstract void OperateStep3();
     8     
     9     //一个返回具体产品对象的方法。
    10     public abstract Product GetResult();
    11     
    12 }//end class Builder

      ConcreteBuilderA的实现代码是:

     1 //具体建造者,负责生产ProductA的对象。
     2 public class ConcreteBuilderA extends Builder {
     3 
     4     private ProductA pa;
     5     
     6     public ConcreteBuilderA() {
     7         // TODO Auto-generated constructor stub
     8         this.pa = new ProductA();
     9     }//end method ConcreteBuilderA
    10     
    11     //为产品A中的属性attribute1赋值。
    12     @Override
    13     public void OperateStep1() {
    14         // TODO Auto-generated method stub
    15         this.pa.setAttribute1("这是ProductA的属性attribute1的值:A1");
    16         
    17         System.out.println(this.pa.getAttribute1());
    18     }//end method OperateStep1
    19 
    20     //为产品A中的属性attribute2赋值。
    21     @Override
    22     public void OperateStep2() {
    23         // TODO Auto-generated method stub
    24         this.pa.setAttribute2("这是ProductA的属性attribute2的值:A2");
    25         
    26         System.out.println(this.pa.getAttribute2());
    27     }//end method OperateStep2
    28 
    29     //为产品A中的属性attribute3赋值。
    30     @Override
    31     public void OperateStep3() {
    32         // TODO Auto-generated method stub
    33         this.pa.setAttribute3("这是ProductA的属性attribute3的值:A3");
    34         
    35         System.out.println(this.pa.getAttribute3());
    36     }//end method OperateStep3
    37 
    38     //返回建立好的ProductA的对象。
    39     @Override
    40     public Product GetResult() {
    41         // TODO Auto-generated method stub
    42         return this.pa;
    43     }//end method GetResult
    44 
    45 }//end class ConcreteBuilderA

      ConcreteBuilderB的实现代码是:

     1 //具体建造者,负责生产ProductB的对象。
     2 public class ConcreteBuilderB extends Builder {
     3 
     4     private ProductB pb;
     5     
     6     public ConcreteBuilderB() {
     7         // TODO Auto-generated constructor stub
     8         this.pb = new ProductB();
     9     }//end method ConcreteBuilderB
    10     
    11     //为产品B中的属性attribute3赋值。
    12     @Override
    13     public void OperateStep1() {
    14         // TODO Auto-generated method stub
    15         this.pb.setAttribute3("这是ProductB的属性attribute3的值:B1");
    16         
    17         System.out.println(this.pb.getAttribute3());
    18     }//end method OperateStep1
    19 
    20     //为产品B中的属性attribute2赋值。
    21     @Override
    22     public void OperateStep2() {
    23         // TODO Auto-generated method stub
    24         this.pb.setAttribute2("这是ProductB的属性attribute2的值:B2");
    25         
    26         System.out.println(this.pb.getAttribute2());
    27     }//end method OperateStep2
    28 
    29     //为产品B中的属性attribute1赋值。
    30     @Override
    31     public void OperateStep3() {
    32         // TODO Auto-generated method stub
    33         this.pb.setAttribute1("这是ProductB的属性attribute1的值:B3");
    34         
    35         System.out.println(this.pb.getAttribute1());
    36     }//end method OperateStep3
    37 
    38     //返回建立好的ProductB的对象。
    39     @Override
    40     public Product GetResult() {
    41         // TODO Auto-generated method stub
    42         return this.pb;
    43     }//end method GetResult
    44 
    45 }//end class ConcreteBuilderB

      Director的实现代码是:

     1 //监督者,负责对外接口,按一定顺序调用Builder中的三个为Product产品属性赋值方法。
     2 public class Director {
     3     
     4     private Builder builder;
     5     
     6     public Director(Builder builder) {
     7         // TODO Auto-generated constructor stub
     8         this.builder = builder;
     9     }//end method Director
    10     
    11     //调用三个赋值方法,并返回建造结果。
    12     public Product GetResult() {
    13         this.builder.OperateStep1();
    14         this.builder.OperateStep2();
    15         this.builder.OperateStep3();
    16         
    17         return this.builder.GetResult();
    18     }//end method GetResult
    19     
    20 }//end method Director

    4、点击此处下载源码

  • 相关阅读:
    Python 简单的方法爬取b站dnf视频封面
    Opencv学习(一)
    某个代码
    2017年江西理工大学C语言程序设计竞赛(高级组)
    2017年江西理工大学C语言程序设计竞赛(初级组)
    两数相除
    华东交通大学2017年ACM“双基”程序设计竞赛 1009
    华东交通大学2017年ACM“双基”程序设计竞赛 1005
    UE4联机多人游戏基本设置
    菜鸟学习物联网---辨析基于Andriod 5.1,Linux,Windows10开发Dragon Board 410c板
  • 原文地址:https://www.cnblogs.com/minbaba/p/6368529.html
Copyright © 2011-2022 走看看