• (@WhiteTaken)设计模式学习——建造者模式


    Builder模式,也就是建造者模式或者生成器模式,是GoF提出的23种设计模式的一种。

    这种模式是用来隐式的创建复合对象而提出来的。

    创建复合对象的过程,不在主客户端显示。

    下面直接上代码。以修建房屋为例子。

    1.修建房屋,我们需要实例化一个房子,房子需要能修建门、地板、墙壁等。这时候我们需要有一个房子类。我们需要为其添加get set方法。

     1 /*
     2  * 房子 可以修建门窗、地板、墙
     3  */
     4 public class House {
     5     private String door;
     6     private String floor;
     7     private String wall;
     8     
     9     public String getDoor() {
    10         return door;
    11     }
    12     public void setDoor(String door) {
    13         this.door = door;
    14     }
    15     public String getFloor() {
    16         return floor;
    17     }
    18     public void setFloor(String floor) {
    19         this.floor = floor;
    20     }
    21     public String getWall() {
    22         return wall;
    23     }
    24     public void setWall(String wall) {
    25         this.wall = wall;
    26     }    
    27 }

    2.但是我们发现,我们想要修建房子,在主客户端中我们需要创建一个房子的实例,然后调用其各种set方法,创建这个房子的属性。这样确实可以修建一个简单的房子,但是房子是有不同种类的,比如平房、公寓、写字楼、住宅等等。

    这样的话,我们需要用尽量简洁的代码在主客户端建造我们的房子。我们把修建房子的工作交给工程队完成,但是不同的工程队,修建的房子的类型是不同的。所以我们需要把工程队抽象成一个接口。

    1 /*
    2  * 房屋建造者(工程队) 修建不同的房子 ,建造者不同, 公寓、平房、商业住宅
    3  */
    4 public interface HouseBuilder {
    5     public void makeDoor();
    6     public void makeFloor();
    7     public void makeWall();
    8     public House returnHouse();
    9 }

    3.能实现这个接口的类,当然就是不同的工程队啦。我们这时候可以派遣两个工程队分别完成公寓和住宅的建造任务。修建完毕需要返回修建好的住宅验收。

     1 /*
     2  * 修建公寓的建造者,需要实现修建门、地板、墙的方法
     3  */
     4 public class GoogyuBuilder implements HouseBuilder {
     5 
     6     House house =new House();
     7     public void makeDoor() {
     8         house.setDoor("WhiteTaken--公寓--门");    
     9     }
    10 
    11     public void makeFloor() {
    12         house.setFloor("WhiteTaken--公寓--地板");
    13     }
    14 
    15     public void makeWall() {
    16         house.setWall("WhiteTaken--公寓--墙");
    17     }
    18     
    19     public House returnHouse(){
    20         return house;
    21     }
    22 }
    23 
    24 /*
    25  * 住宅的建造者需要修建门、地板、墙
    26  */
    27 public class ZhuzhaiBuilder implements HouseBuilder {
    28     
    29     House house= new House();
    30     
    31     public void makeDoor() {
    32         house.setDoor("WhiteTaken--住宅--门");
    33     }
    34 
    35     public void makeFloor() {
    36         house.setFloor("WhiteTaken--住宅--地板");
    37     }
    38 
    39     public void makeWall() {
    40         house.setWall("WhiteTaken--住宅--墙");
    41     }
    42     
    43     public House returnHouse(){
    44         return house;
    45     }
    46 }

    4.但是我们只有上边的这部分还不是特别完美。我们想修建不同的房子,就得去调用不同建造者的make方法。在主客户端并不是好,因为会写入重复的代码。

    这是我们可以添加设计师类,设计师可以调用不同的工程队,完成不同的工作。

     1 /*
     2  * 设计师负责建造房子,建造不同的房子,需要不同的工程队
     3  */
     4 public class HouseDirector {
     5     public static void SetBuilder(HouseBuilder houseBuilder)
     6     {
     7         houseBuilder.makeDoor();
     8         houseBuilder.makeFloor();
     9         houseBuilder.makeWall();
    10     }
    11 }

    5.好,这时候我们可以在主客户端建造我们的房子。

     1 public class MainClass {
     2     public static void main(String[] args) {
     3         //HouseBuilder builder=new GoogyuBuilder();//公寓建造者
     4         HouseBuilder builder=new ZhuzhaiBuilder();//住宅建造者
     5         HouseDirector.SetBuilder(builder);//设计师让建造者建造不同的房屋
     6         House house=builder.returnHouse();//验收房屋
     7         System.out.println(house.getDoor());
     8         System.out.println(house.getFloor());
     9         System.out.println(house.getWall());
    10     }
    11 }

    打印的结果。

    1.当实例化一个公寓建造者,情况如下。

    2.当实例化一个住宅建造者,情况如下。

     

    以上打印过程,我们只需要实例化不同的建造者就可以完成。即在主客户端中我们仅仅修改了少量的代码就完成了大部分的工作。极大的提高了效率和可拓展性。

    建造者模式在哪里使用?

    1.对象的创建,此模式是为对象的创建而设计的模式。

    2.创建一个复合对象时可以用到,且创建的过程不需要让外界知道。

    3.不同的工厂对产品属性有不同的创建方法,如果建造者不同,创建的复合对象是不同的。

  • 相关阅读:
    javascript 数组Array对象
    使div浮动层显示在Select组件上面
    CSS中expression使用简介
    Error: Error #2176: 某些动作(如显示弹出窗口的动作)只能通过用户交互来调用
    用.Net处理xmlHttp发送异步请求
    使用反射动态创建对象及调用对象方法
    Asp.net实现在线截图(大图截取为小图)
    一个webproxy代理类
    Asp.net如何截屏
    用 ASP.NET 做网站截图(代码示例)
  • 原文地址:https://www.cnblogs.com/WhiteTaken/p/6422186.html
Copyright © 2020-2023  润新知