设计模式——生成器模式

Posted 知止

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式——生成器模式相关的知识,希望对你有一定的参考价值。

1.描述

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

2.模式的使用

·产品(Product):具体生成器要构造的复杂对象。

·抽象生成器(Builder):一个接口,该接口除了为创建一个Product对象的各个组件定义了若干方法外,还要定义返回Product对象的方法。

·具体生成器(ConcreteBuilder):实现Builder接口的类,具体生成器将实现Builder接口所定义的方法。

·指挥者(Director):指挥者是一个类,该类需含有Builder接口声明的变量。指挥者的职责是负责向用户提供具体生成器,即指挥者将请求具体生成器来构造用户所需的Product对象,如果所请求的具体生成器成功的构造出Product对象,指挥者就可以让该具体生成器返回所构造的Product

3.使用情景

·当系统准备为用户提供一个内部构造复杂的对象,而且构造方法中编写创建该对象的代码无法满足用户需求时,可以使用该模式。

·当某些系统要求对象的构造过程必须独立于创建该对象的类时。

4.优点

·将创建对象的构造过程封装在具体生成器中,使用户可以使用不同的具体生成器得到该对象的不同表示。

·生成器模式将对象的构造过程从创建对象的类中分离,使用户无需了解该对象的具体组件。

·可以精细控制对象的构造过程。生成器将对象的构造过程分解成若干步骤,这就使程序更加精细可控。

·讲对象的构造过程与创建对象的类解耦且满足“开——闭”原则

5.UML

 

6案例

三角、圆、矩形为基础图形类。现在要求一个几何类,可以创建由三角、长方形组成的图形,也可以创建由原型、三角形,等等各种图形组合的图形。但是不希望几何类包含所有基础图形对象(三角、圆、矩形)的引用;而且几何类要满足产生特殊图形的要求,比如三角形为等边三角形,矩形为正方形等要求。为了方便扩展,可以这样使用生成器模式:

 

  1 package 生成器模式;
  2 
  3 import java.util.ArrayList;
  4 
  5 public class test1 {
  6 
  7     public static void main(String[] args) {
  8         ConcreteBuilder1 cb = new ConcreteBuilder1();
  9         Geometry g = cb.createGeometry();
 10         System.out.println(g.getList().get(0).getName() + "面积是" + g.getList().get(0).getArea());
 11     }
 12 }
 13 
 14 abstract class abstractGeometry{
 15     public abstract double getArea();
 16     public abstract void setName(String name);
 17     public abstract String getName();
 18 }
 19 
 20 /*
 21  * 三角
 22  */
 23 class Triangle extends abstractGeometry{
 24     long[] sides = new long[3];
 25     String name;
 26     
 27     public String getName() {
 28         return name;
 29     }
 30     public void setName(String name) {
 31         this.name = name;
 32     }
 33     Triangle(long side1, long side2, long side3){
 34         sides[0] = side1;
 35         sides[1] = side2;
 36         sides[2] = side3;
 37     }
 38     @Override
 39     public double getArea() {
 40         double p = (sides[0] + sides[1] + sides[2])/2;
 41         return Math.sqrt(p * (p - sides[0]) * (p - sides[1]) * (p - sides[2]));
 42     }
 43     //判断是否为等边三角形
 44     public boolean isEqu(){
 45         return sides[1] == sides[0] && sides[1] == sides[2] ? true : false;
 46     }
 47     //判断是否为直角三角形
 48     public boolean isReg(){
 49         return (Math.pow(sides[0], 2) + Math.pow(sides[1], 2)) == Math.pow(sides[2], 2) 
 50                 || (Math.pow(sides[0], 2) + Math.pow(sides[2], 2)) == Math.pow(sides[1], 2) 
 51                 || (Math.pow(sides[2], 2) + Math.pow(sides[1], 2)) == Math.pow(sides[0], 2) ? true :false;
 52     }
 53 }
 54 
 55 /*
 56  * 圆
 57  */
 58 class Circle extends abstractGeometry{
 59     long radius;
 60     String name;
 61     
 62     public String getName() {
 63         return name;
 64     }
 65     public void setName(String name) {
 66         this.name = name;
 67     }
 68     Circle(long radius){
 69         this.radius = radius;
 70     }
 71     @Override
 72     public double getArea() {
 73         return Math.PI * radius * radius;
 74     }
 75     
 76 }
 77 
 78 /*
 79  * 矩形
 80  */
 81 class Rectangle extends abstractGeometry{
 82     long[] sides = new long[2];
 83     String name;
 84     
 85     public String getName() {
 86         return name;
 87     }
 88     public void setName(String name) {
 89         this.name = name;
 90     }
 91     Rectangle (long side1, long side2){
 92         sides[0] = side1;
 93         sides[1] = side2;
 94     }
 95     @Override
 96     public double getArea() {
 97         return sides[0] * sides[1];
 98     }
 99     //判断是否为正方形
100     public boolean isSqu(){
101         return sides[0] == sides[1] ? true : false;
102     }
103 }
104 
105 /*
106  * 工厂
107  */
108 interface abstractFactory{
109     public abstractGeometry creatTriangle(long side1, long side2,long side3);
110     public abstractGeometry creatCircle(long side);
111     public abstractGeometry creatRectangle(long side1, long side2);
112     public abstractGeometry creatEquTri(long side1, long side2,long side3);//等边三角形
113     public abstractGeometry creatregularTri(long side1, long side2,long side3);//正三角形
114     public abstractGeometry creatSquare(long side1, long side2);//正方形
115 }
116 
117 /*
118  * 具体工厂
119  */
120 class Factory implements abstractFactory{
121     //生产三角形
122     public abstractGeometry creatTriangle(long side1, long side2,long side3) {
123         if(side1 + side2  > side3 && side2 +side3 > side1){
124             Triangle t = new Triangle(side1, side2, side3);
125             t.setName("一个三角形");
126             return t;
127         }
128         return null;
129     }
130     //生产圆形
131     public abstractGeometry creatCircle(long radius) {
132         Circle c = new Circle(radius);
133         c.setName("一个圆");
134         return c;
135     }
136     //生产矩形
137     public abstractGeometry creatRectangle(long side1, long side2) {
138         Rectangle r = new Rectangle(side1, side2);
139         r.setName("一个矩形");
140         return r;
141     }
142     //生产等边三角形
143     public abstractGeometry creatEquTri(long side1, long side2,long side3) {
144         Triangle t = (Triangle) this.creatTriangle(side1, side2, side3);
145         if(t.isEqu()){
146             t.setName("一个等边三角形");
147             return t;
148         }
149         return null;
150     }
151     //生产直角三角形
152     public abstractGeometry creatregularTri(long side1, long side2,long side3) {
153         Triangle t = (Triangle) this.creatTriangle(side1, side2, side3);
154         if(t.isReg()){
155             t.setName("一个直角三角形");
156             return t;
157         }
158         return null;
159     }
160     //生产正方形
161     public abstractGeometry creatSquare(long side1, long side2) {
162         Rectangle r = (Rectangle) this.creatRectangle(side1, side2);
163         if(r.isSqu()){
164             r.setName("一个正方形");
165             return r;
166         }
167         return null;
168     }
169 }
170 
171 /*
172  * 抽象生成器
173  */
174 interface Builder{
175     Factory factory = new Factory();
176 }
177 
178 /*
179  * 具体生成器
180  */
181 class ConcreteBuilder1 implements Builder{
182     Geometry  geometry;
183     ConcreteBuilder1(){
184         geometry = new Geometry();
185     }
186     
187     public Geometry createGeometry(){
188         geometry.getList().add(factory.creatTriangle(3, 4, 5));
189         return geometry;
190     }
191 }
192 /*
193  * 产品
194  */
195 class Geometry{
196     private ArrayList<abstractGeometry> list;
197     Geometry(){
198         this.list = new ArrayList<abstractGeometry>();
199     }
200     public ArrayList<abstractGeometry> getList(){
201         return this.list;
202     }
203 }

 

 

以上是关于设计模式——生成器模式的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用片段保存夜间模式状态

Azure 机器人微软Azure Bot 编辑器系列 : 机器人/用户提问回答模式,机器人从API获取响应并组织答案 (The Bot Framework Composer tutorial(代码片段

csharp C#代码片段 - 使类成为Singleton模式。 (C#4.0+)https://heiswayi.github.io/2016/simple-singleton-pattern-us

java 查看寻呼机设计模式与片段。

如何仅将应用程序片段设置为纵向模式?

Android:带有片段的模板模式