建造者模式

建造者模式

《目录》

UML类图:

![:\搜狗高速下载\未命名文件 (1).pn](D:\搜狗高速下载\未命名文件 (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://juejin.im/post/5acab53e5188257ddb0fe6c9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值