建造者模式

作者: 死磕自己 | 来源:发表于2018-04-09 08:39 被阅读31次

    建造者模式

    hello world.png

    《目录》

    未命名文件.png

    UML类图:

    未命名文件 (2).png

    介绍:

    1、将一个复杂对象的构建与它表示分离,使得童谣的构建过程可以创建不同的表示
    

    2、主要作用

     1、 用户只需要给出指定复杂对象的类型和内容;
    2、建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节都隐藏起来)
    

    3、解决的问题

    • 方便用户创建复杂的对象(不需要知道实现过程)
    • 代码的复用性&封装性(将对象构建过程和细节进行封装&复用)

    实例

    接下来我们用一个例子来说明以上给大家讲解的问题和内容

    相信大家很多人都玩过《魔兽世界3 冰封王座》,不知道大家记不记得《建房子模式》,我们可以选择建房造小兵,英雄,然后带着大部队干掉对面。
    

    分析分析:

    
        1、背景: 我们开始建造房子,小兵,英雄,攻打对面
        
        2、过程:
                1、我们(client)开始 和  游戏模式(Diretor)沟通  寻找 建造的需求
                2、了解需求后,我们把我们需要的小兵和英雄以及房子分为各个部件(Builder)的请求(金币 、 木材 、 时间)
                3、指挥建房子的农民(ConcreateBuilder) 去构建组件
                4、将组件组长成游戏模式需要的,开始建造 成功建造为房子(Product)
    
    

    开始步骤

    1. 步骤一
    public abstract class Builder {
    
       // 第一步 : 挖矿 得金币
       // 声明为抽象方法,具体由子类事项
       public abstract void GetGold();
    
       // 第二步: 砍树
       // 声明为抽象方法,具体由子类事项
       public abstract void GetTree();
       
       // 第三部 等待时间建造
       // 声明为抽象方法,具体由子类事项
       public abstract void WaitTime();
       
       //返回房子的方法 : 获得建造好的房子
       public abstract House GetHouse();
    }
    
    
    1. 步骤二

      public class Director {
      
       //指挥农民假造房屋
       public void construct(Builder builder){
           builder.GetGold();
           builder.GetTree();
           builder.WaitTime();
       }
      }
      
      

    2. 步骤三

      public class House {
       
       //House组件的集合
          private List<String> parts = new ArrayList<String>();
      
       public void ADD(String string) {
           // TODO Auto-generated method stub
           parts.add(string);
       }
      
       public  void show() {
           for (int i = 0; i < parts.size(); i++) {
               System.out.println("组件:"+parts.get(i)+"已经有了");
           }
           System.out.println("房子建造完成,请继续");
       }
      }
      
    3. 步骤四

    public class ConcreateBuilder extends Builder {
    
      //创建产品实例
      House house = new House();
    
      
      //建造产品
      @Override
      public void GetGold() {
          // TODO Auto-generated method stub
          house.ADD("挖矿得金币");
      }
    
      @Override
      public void GetTree() {
          // TODO Auto-generated method stub
          house.ADD("砍树得木材");
      }
    
      @Override
      public void WaitTime() {
          // TODO Auto-generated method stub
          house.ADD("等待建造完成的时间");
      }
    
      @Override
      public House GetHouse() {
          // TODO Auto-generated method stub
          
          return house;
      }
      
      
      
    }
    
    1. 步骤五
    public class  palyer {
    
     public static void main(String[] args) {
         
         //开始打开游戏
         //找到希望玩的种族
           Director director = new Director();
           Builder builder = new ConcreateBuilder();
    
         //沟通需求后,我们开始进行游戏
         director.construct(builder);
    
         //东西都搞定了
         House house = builder.GetHouse();
         //把房子建造出来
         house.show();
     }
    }
    

    结果

    组件:挖矿得金币已经有了
    组件:砍树得木材已经有了
    组件:等待建造完成的时间已经有了
    房子建造完成,请继续
    
    

    通过上述的例子,我相信大家多少都有一点了解,可能我的这个例子不是特别的适合,但是这也是我想到的一些经验和分享,希望大家可以结合自己的例子来自己分析一遍,谢谢

    优缺点

    在概念和例子解析完成后,我们来分析一下其中的优缺点:

    优点

    1. 易于解耦
      将产品本身与产品创建的过程进行解耦,可以使用相同的创建过程来得到不同的产品,也就说细节以来抽象

    2. 易于精确控制对象的创建
      将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰

    3. 易于拓展
      怎家新的具体建造者无需修改原有类库的代码,易于拓展,符合开闭原则

      每一个具体建造这都相对独立,而与其他的具体建造无关,因此可以很方便的替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
      

    缺点:

    • ​ 建造者模式所创建的产品一般具有较多的共同点,起组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此起适用范围受到一定的限制。
    • 如果产品的内部变化复杂,可能导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

    应用场景

    • 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
    • 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

    总结

    希望大家可以好好的探索,以自身的例子为例来好好的学习我们这个建造者模式。感谢大家!!

    又想到一个例子,希望有空可以看一看

    相关文章

      网友评论

        本文标题:建造者模式

        本文链接:https://www.haomeiwen.com/subject/jtjbhftx.html