• 设计模式(十一)——生成器模式


    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 }

  • 相关阅读:
    《一课经济学》八、通货膨胀与尾声
    《一课经济学》七、房租管制和最低工资法
    《一课经济学》六、政府价格管制
    《一课经济学》五、价值体系的运作
    《一课经济学》四、国际贸易
    《一课经济学》三、就业相关
    《一课经济学》二、政府的投资、税收与信贷
    《一课经济学》一、破窗谬误与“战祸之福”
    《人类简史》十五、开启未来(下)——智慧之心
    C++ Template之类模版
  • 原文地址:https://www.cnblogs.com/cxy2016/p/7670129.html
Copyright © 2020-2023  润新知