zoukankan      html  css  js  c++  java
  • 设计模式Day02

    1、生成器模式
     生成器模式也称为建造者模式。生成器模式的意图在于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
     生成器模式的编程步骤:
     (1)定义一个产品类;
      由于不在该类完成Product类对象的创建,所以无需显示定义构造方法。
     (2)定义n个生成器Build类;
      生成器是用来生成Product对象的,因此一般来说,Product是生成器类的一个成员变量;每创建一个Product对象,本质上先创建Unit1,Unit2,...UnitN,再把它们组合成所需的Product对象,因此需要n个createUnit()方法及一个组合方法composite();由于createUnit()及composite()是共性,因此可定义共同的生成器类接口,n个生成器类均从此接口派生即可。
     (3)定义一个统一调度类,也叫指挥者类。是对生成器接口IBuild的封装。
     生成器设计模式涉及4个关键角色:产品(Product)、抽象生成器(IBuild)、具体生成器(Builder)、指挥者(Director)。在生成器模式中,抽象生成器和具体生成器是必需的,指挥者类需要在实际问题中认真考虑,加以取舍。

    [代码]java代码:

    1
    2
    3
    public class Unit1 {}
    public class Unit2 {}
    public class Unit3 {}

    [代码]java代码:

    1
    2
    3
    4
    5
    6
    //定义一个产品类
    public class Product {
        Unit1 u1;
        Unit2 u2;
        Unit3 u3;
    }

    [代码]java代码:

    1
    2
    3
    4
    5
    6
    7
    //定义生成器类接口IBuild
    public interface IBuild {
        public void createUnit1();
        public void createUnit2();
        public void createUnit3();
        public Product composite();//返回值是Product对象
    }

    [代码]java代码:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class BuildProduct implements IBuild {//生成第一种Product
        Product p=new Product();//Product是成员变量
     
        @Override
        public void createUnit1() {
            //p.u1=...          //创建Unit1
        }
     
        @Override
        public void createUnit2() {
            //p.u2=...          //创建Unit2
        }
     
        @Override
        public void createUnit3() {
            //p.u3=...          //创建Unit3
        }
     
        @Override
        public Product composite() {
            //...               //关联Unit1,Unit2,Unit3
            return p;           //返回Product对象p
        }
     
    }

    [代码]java代码:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    public class Director {
        private IBuild build;
        public Director(IBuild build){
            this.build=build;
        }
        public Product build(){
            build.createUnit1();
            build.createUnit2();
            build.createUnit3();
            return build.composite();
        }
        public static void main(String[] args) {
            IBuild build=new BuildProduct();
            Director direct=new Director(build);
            Product p=direct.build();
        }
    }


    2、利用Product派生类方法,也可以实现类似的生成功能。

    [代码]java代码:

    1
    2
    3
    public class Unit1 {}
    public class Unit2 {}
    public class Unit3 {}

    [代码]java代码:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    //定义抽象生成器
    public abstract class Product {
        Unit1 u1;
        Unit2 u2;
        Unit3 u3;
        abstract void createUnit1();    //表明子类要创建Unit1
        abstract void createUnit2();    //表明子类要创建Unit2
        abstract void createUnit3();    //表明子类要创建Unit3
        abstract void composite();      //表明子类要组合Unit1、Unit2、Unit3
    }

    [代码]java代码:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    //定义具体生成器
    public class BuildProduct extends Product{
     
        @Override
        void createUnit1() {
             
        }
     
        @Override
        void createUnit2() {
             
        }
     
        @Override
        void createUnit3() {
             
        }
     
        @Override
        void composite() {
             
        }
     
    }

    [代码]java代码:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    //定义指挥者类
    public class Director {
        Product p;
        public Director(Product p){
            this.p=p;
        }
        void build(){
            p.createUnit1();
            p.createUnit2();
            p.createUnit3();
            p.composite();
        }
    }
  • 相关阅读:
    老生长谈:css实现右侧固定宽度,左侧宽度自适应
    链接rel属性external、nofollow、external nofollow三种写法的区别
    文字无缝向上滚动
    JS中判断鼠标按键的问题
    js 字符串转换数字
    jS字符串大小写转换实现方式
    JS截取字符串
    CentOS中查看物理CPU信息的方法
    如何开启MYSQL远程连接权限
    PHP中数组排序实例学习
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5631911.html
Copyright © 2011-2022 走看看