1. 程式人生 > >設計模式(十一)——生成器模式

設計模式(十一)——生成器模式

所有 boolean concrete @override ttr stat bsp println 無需

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 }

技術分享

設計模式(十一)——生成器模式