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 }