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 }