为了账号安全,请及时绑定邮箱和手机立即绑定

建造者模式

建造者模式

hello world.png

《目录》

未命名文件.png

UML类图:

未命名文件 (2).png

[图片上传失败...(image-417cd-1523234349198)].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();
    }
    
  2. 步骤二

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

  3. 步骤三

    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("房子建造完成,请继续");
    }
    }
  4. 步骤四

    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;
    }
    
    }
  5. 步骤五

    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. 易于拓展
    怎家新的具体建造者无需修改原有类库的代码,易于拓展,符合开闭原则

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

缺点:

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

应用场景

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

总结

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

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

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
移动开发工程师
手记
粉丝
7
获赞与收藏
35

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消