• 【设计模式】2、生成器模式(建造者模式)


    模式结构:

     1 package com.shejimoshi.create.Builder;
     2 
     3 
     4 /**
     5  * 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
     6  *         适用性:
     7  *             当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
     8  *             当构造过程必须允许被构造的对象有不同的表示时
     9  * 时间:2016年2月12日下午4:33:59
    10  * 作者:cutter_point
    11  */
    12 public abstract class PersonBuilder
    13 {
    14     //绘画一个人物需要使用到的工具
    15     protected String tool1;
    16     protected String tool2;
    17     
    18     public PersonBuilder(String t1, String t2)
    19     {
    20         this.tool1 = t1;
    21         this.tool2 = t2;
    22     }
    23     
    24     //绘画头
    25     public abstract void buildHead();
    26     //画身体
    27     public abstract void buildBody();
    28     //画左脚右脚
    29     public abstract void buildArmLeft();
    30     public abstract void buildArmRight();
    31     //画左手右手
    32     public abstract void buildLegLeft();
    33     public abstract void buildLegRight();
    34 }

    我们的抽象生成器派生出相应的子类,用来构造相应的实际使用类型

     1 package com.shejimoshi.create.Builder;
     2 
     3 
     4 /**
     5  * 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
     6  *         适用性:
     7  *             当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
     8  *             当构造过程必须允许被构造的对象有不同的表示时
     9  * 时间:2016年2月12日下午4:50:31
    10  * 作者:cutter_point
    11  */
    12 public class PersonThinBuilder extends PersonBuilder
    13 {
    14 
    15     public PersonThinBuilder(String t1, String t2)
    16     {
    17         super(t1, t2);
    18     }
    19 
    20     @Override
    21     public void buildHead()
    22     {
    23         System.out.println("画出一个瘦子的头");
    24     }
    25 
    26     @Override
    27     public void buildBody()
    28     {
    29         System.out.println("画出一个瘦子的身体");
    30     }
    31 
    32     @Override
    33     public void buildArmLeft()
    34     {
    35         System.out.println("画出瘦子的左臂");
    36     }
    37 
    38     @Override
    39     public void buildArmRight()
    40     {
    41         System.out.println("画出瘦子的右臂");
    42     }
    43 
    44     @Override
    45     public void buildLegLeft()
    46     {
    47         System.out.println("画出瘦子左腿");
    48     }
    49 
    50     @Override
    51     public void buildLegRight()
    52     {
    53         System.out.println("画出瘦子的右腿");
    54     }
    55 
    56 }
     1 package com.shejimoshi.create.Builder;
     2 
     3 
     4 /**
     5  * 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
     6  *         适用性:
     7  *             当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
     8  *             当构造过程必须允许被构造的对象有不同的表示时
     9  * 时间:2016年2月12日下午4:53:49
    10  * 作者:cutter_point
    11  */
    12 public class PersonFatBuilder extends PersonBuilder
    13 {
    14 
    15     public PersonFatBuilder(String t1, String t2)
    16     {
    17         super(t1, t2);
    18     }
    19 
    20     @Override
    21     public void buildHead()
    22     {
    23         System.out.println("画出一个胖子的头");
    24     }
    25 
    26     @Override
    27     public void buildBody()
    28     {
    29         System.out.println("画出一个胖子的身体");
    30     }
    31 
    32     @Override
    33     public void buildArmLeft()
    34     {
    35         System.out.println("画出胖子的左臂");
    36     }
    37 
    38     @Override
    39     public void buildArmRight()
    40     {
    41         System.out.println("画出胖子的右臂");
    42     }
    43 
    44     @Override
    45     public void buildLegLeft()
    46     {
    47         System.out.println("画出胖子左腿");
    48     }
    49 
    50     @Override
    51     public void buildLegRight()
    52     {
    53         System.out.println("画出胖子的右腿");
    54     }
    55 
    56 }

    我们的生成器交给指挥者来实现创建的动作

     1 package com.shejimoshi.create.Builder;
     2 
     3 
     4 /**
     5  * 功能:创建人物的指挥者
     6  * 时间:2016年2月12日下午4:55:14
     7  * 作者:cutter_point
     8  */
     9 public class PersonDirector
    10 {
    11     private PersonBuilder pb;
    12     
    13     //传递相应的人物创建模型
    14     public PersonDirector(PersonBuilder pber)
    15     {
    16         this.pb = pber;
    17     }
    18     
    19     //创建一个人
    20     public void createPerson()
    21     {
    22         pb.buildHead();
    23         pb.buildBody();
    24         pb.buildArmLeft();
    25         pb.buildArmRight();
    26         pb.buildLegLeft();
    27         pb.buildLegRight();
    28     }
    29 }

    测试案例:

     1 package com.shejimoshi.create.Builder;
     2 
     3 
     4 /**
     5  * 功能:客户端程序
     6  * 时间:2016年2月12日下午4:57:41
     7  * 作者:cutter_point
     8  */
     9 public class Test
    10 {
    11     //创建相应的人物
    12     public static void create(PersonBuilder pb)
    13     {
    14         //借助参数传过来的模型创建相应的对象
    15         PersonDirector pd = new PersonDirector(pb);
    16         pd.createPerson();
    17     }
    18     
    19     public static void main(String []args)
    20     {
    21         PersonThinBuilder ptb = new PersonThinBuilder("图像工具", "画笔");
    22         create(ptb); //创建一个瘦子
    23         System.out.println("==============================================================");
    24         PersonFatBuilder pfb = new PersonFatBuilder("图像工具", "画笔");
    25         create(pfb);
    26     }
    27 }

    运行结果:

     1 画出一个瘦子的头
     2 画出一个瘦子的身体
     3 画出瘦子的左臂
     4 画出瘦子的右臂
     5 画出瘦子左腿
     6 画出瘦子的右腿
     7 ==============================================================
     8 画出一个胖子的头
     9 画出一个胖子的身体
    10 画出胖子的左臂
    11 画出胖子的右臂
    12 画出胖子左腿
    13 画出胖子的右腿
  • 相关阅读:
    Harvest of Apples (HDU多校第四场 B) (HDU 6333 ) 莫队 + 组合数 + 逆元
    BZOJ4383/LuoGuP3588 Pustynia/PUS 线段树建图优化
    初识splay
    nowcoder牛客wannafly挑战赛20
    初识树链剖分
    二维数据结构---线段树
    初识莫队——小Z的袜子
    kuangbin带我飞QAQ 并查集
    十个二分九个错?教你如何优雅地写二分查找
    Codeforces Round #436 (Div. 2) E. Fire(dp 记录路径)
  • 原文地址:https://www.cnblogs.com/cutter-point/p/5187144.html
Copyright © 2020-2023  润新知