博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
建造者模式
阅读量:5368 次
发布时间:2019-06-15

本文共 2331 字,大约阅读时间需要 7 分钟。

定义:建造者模式使用多个简单的对象一步一步构建成一个复杂的对象,修改时只需要修改其中相应的一小部分,避免牵一发而动全身。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

角色:

1.AbstractBuilder:抽象建造者

      为创建一个Product对象的各个部件指定抽象接口,将建造的具体过程交与它的子类来实现。一般会有两部分抽象方法,一部分用来建造产品,一个是用来返回产品。如下图,buildPart1和buildPart2用来构造产品,retrieveResult返回产品。
 2.ConcreteBuilder:具体建造者
     实现抽象建造者的抽象方法,之所以这样,是为了便于不同情况下的扩充。
 3.Director:导演者
      负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
 4.Product:产品类
      表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
结构图:

优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

缺点:1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

应用:以下案例示范将一餐饭(product)拆解为每份食物、包装,更改单个食物的属性不需要修改这餐饭。

1.创建一个表示食物条目和食物包装的接口。

public interface Item  {   public String name();   public Packing packing();   public float price();} public interface Packing {   public String pack(); }

2.创建实现 Packing 接口的实体类。

public class Wrapper implements Packing {   public String pack() {   return "Wrapper";}}public class Bottle implements Packing {   public String pack() { return "Bottle";}}

3.创建实现 Item 接口的抽象类,该类提供了默认的功能。

public abstract class Burger : Item {   public Packing packing() { return new Wrapper();  }   public abstract float price();}public abstract class ColdDrink : Item {    public Packing packing() { return new Bottle();}    public abstract float price();}

4.创建扩展了 Burger 和 ColdDrink 的实体类。

public class VegBurger extends Burger {   public float price() { return 25.0f; }   public String name() { return "Veg Burger"; }}public class ChickenBurger extends Burger {   public float price() { return 50.5f; }   public String name() { return "Chicken Burger";}}public class Coke extends ColdDrink {   public float price() {  return 30.0f;}   public String name() { return "Coke";}}public class Pepsi extends ColdDrink {   public float price() {
return 35.0f; } public String name() { return "Pepsi";}}

5.建一个 Meal 类,带有上面定义的 Item 对象,类似定义一餐所包含的类目。

public class Meal {   private List
items = new ArrayList
(); public void addItem(Item item){ items.add(item); } public float getCost() { float cost = 0.0f; for (Item item : items) { cost += item.price(); } return cost; }}

5.使用:

Meal meal = new Meal();meal.addItem(new VegBurger());meal.addItem(new Coke());meal.getcost()获取消费

 

转载于:https://www.cnblogs.com/wang-jin-fu/p/8313239.html

你可能感兴趣的文章
我们为什么要搞长沙.NET技术社区(三)
查看>>
杭电acm Cake
查看>>
js函数中this的指向
查看>>
c++ 引用方式传递数组
查看>>
HBase学习之路 (九)HBase phoenix的使用
查看>>
LeetCode() Remove Duplicates from Sorted Array II
查看>>
【svn】idea svn 文件上会出现一个破书
查看>>
cocos2d-x 3.0 场景切换特效汇总(转)
查看>>
The SortedMap Interface
查看>>
SniperOJ-leak-x86-64
查看>>
bzoj 4260: Codechef REBXOR (01 Trie)
查看>>
学好python
查看>>
css-IE中的border-radius和box-shadow
查看>>
利用bootstrap和webform的异步CRUD及分页
查看>>
HDUOJ 1879继续畅通工程(并查集)
查看>>
OC12_自动释放池
查看>>
Saiku资源帖
查看>>
解决手机页面中点击文本框,网页放大问题
查看>>
2-5
查看>>
牛客多校3 A-PACM Team(状压降维+路径背包)
查看>>