建造者模式
《目录》:
UML类图:
[图片上传失败...(image-417cd-1523234349198)].png)
介绍:
1、将一个复杂对象的构建与它表示分离,使得童谣的构建过程可以创建不同的表示
2、主要作用
1、 用户只需要给出指定复杂对象的类型和内容;
2、建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节都隐藏起来)
3、解决的问题
- 方便用户创建复杂的对象(不需要知道实现过程)
- 代码的复用性&封装性(将对象构建过程和细节进行封装&复用)
实例
接下来我们用一个例子来说明以上给大家讲解的问题和内容
相信大家很多人都玩过《魔兽世界3 冰封王座》,不知道大家记不记得《建房子模式》,我们可以选择建房造小兵,英雄,然后带着大部队干掉对面。
分析分析:
1、背景: 我们开始建造房子,小兵,英雄,攻打对面
2、过程:
1、我们(client)开始 和 游戏模式(Diretor)沟通 寻找 建造的需求
2、了解需求后,我们把我们需要的小兵和英雄以及房子分为各个部件(Builder)的请求(金币 、 木材 、 时间)
3、指挥建房子的农民(ConcreateBuilder) 去构建组件
4、将组件组长成游戏模式需要的,开始建造 成功建造为房子(Product)
开始步骤
-
步骤一
public abstract class Builder { // 第一步 : 挖矿 得金币 // 声明为抽象方法,具体由子类事项 public abstract void GetGold(); // 第二步: 砍树 // 声明为抽象方法,具体由子类事项 public abstract void GetTree(); // 第三部 等待时间建造 // 声明为抽象方法,具体由子类事项 public abstract void WaitTime(); //返回房子的方法 : 获得建造好的房子 public abstract House GetHouse(); }
-
步骤二
public class Director { //指挥农民假造房屋 public void construct(Builder builder){ builder.GetGold(); builder.GetTree(); builder.WaitTime(); } }
-
步骤三
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("房子建造完成,请继续"); } }
-
步骤四
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; } }
-
步骤五
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(); } }
结果
组件:挖矿得金币已经有了 组件:砍树得木材已经有了 组件:等待建造完成的时间已经有了 房子建造完成,请继续
通过上述的例子,我相信大家多少都有一点了解,可能我的这个例子不是特别的适合,但是这也是我想到的一些经验和分享,希望大家可以结合自己的例子来自己分析一遍,谢谢
优缺点
在概念和例子解析完成后,我们来分析一下其中的优缺点:
优点
-
易于解耦
将产品本身与产品创建的过程进行解耦,可以使用相同的创建过程来得到不同的产品,也就说细节以来抽象 -
易于精确控制对象的创建
将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰 -
易于拓展
怎家新的具体建造者无需修改原有类库的代码,易于拓展,符合开闭原则
。每一个具体建造这都相对独立,而与其他的具体建造无关,因此可以很方便的替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
缺点:
- 建造者模式所创建的产品一般具有较多的共同点,起组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此起适用范围受到一定的限制。
- 如果产品的内部变化复杂,可能导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
应用场景
- 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
总结
希望大家可以好好的探索,以自身的例子为例来好好的学习我们这个建造者模式。感谢大家!!
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦