假如我们需要一个对象,这个对象的构成需要其它一些子对象组成。今后的情况是,这些子对象可能会发生变换,它们之间的不同组合又会构建成新的对象。举个例子,比如套餐这个抽象的对象,它需要其他一些吃的或者喝的对象组成。比如肯德基豪华大餐,它可能是薯条,墨汁鱿鱼汉堡,可乐,鸡翅构成的。另一个套餐的组成可能是芬达,鸡腿,薯条,香辣牛肉堡。。。
此时我们会考虑用到设计模式中的建造者模式,它能够创建一个对象自由组合那些子对象。
我看了runoob.com中的例子,根据自己的理解写了一些。
我们需要做一个制造套餐对象的类,这个类就是建造者(BuilderMeal),用来制造我们想要的子对象的组合,封装在套餐(Meal)这个对象中。
所有的子对象也就是具体的吃喝之类,都有一些共性,比如名称,价格,还有包装方式等,我们把它们封装在一个接口中:
![](https://img.haomeiwen.com/i3207492/742d276237d1b2f3.png)
其中的Pack是一个接口,用来表示包装方式,吃的我们就是打包(Wrapper),喝的就是装在瓶子(Bottle)里。
![](https://img.haomeiwen.com/i3207492/0e21566f7036aa40.png)
![](https://img.haomeiwen.com/i3207492/af5f50cc201f3fff.png)
吃的东西我叫做Burger,喝的叫做Drink
![](https://img.haomeiwen.com/i3207492/9e4b5640883dd6f3.png)
![](https://img.haomeiwen.com/i3207492/685b312156ba7b87.png)
之所以做成抽象类是因为所有吃的都是打包,喝的都装在瓶子中。子类继承之后自动实现了打包方式,提高了代码的复用性。而抽象类中的抽象方法和未实现的接口方法都让继承的子类必须各自实现。于是随便写了几个,这里只贴一个吃的和一个喝的子类。
![](https://img.haomeiwen.com/i3207492/28c4dbea769fafc0.png)
![](https://img.haomeiwen.com/i3207492/f857aabeb6cb818f.png)
接下来就是Meal这个类了,本质上它只是子对象的集合,所以提供了一个存放Item对象的集合,和添加该对象的方法,除此之外,还提供了Meal的总价格,等于各个子对象的价格之和。
![](https://img.haomeiwen.com/i3207492/afc3aa6b0d15d075.png)
最后就是建造者,用来制造具体的Meal:
![](https://img.haomeiwen.com/i3207492/37015cf4d2ff9fee.png)
这里制造了两种类型的meal。最后我们使用Demo类来看看效果:
![](https://img.haomeiwen.com/i3207492/2a43d0e3ae6843b7.png)
控制台的输出如下:
![](https://img.haomeiwen.com/i3207492/75b5427d73eada69.png)
建造者模式让建造者类完全独立了出来。以后添加任何子对象或者创建新的Meal都非常容易轻松,不需要任何额外的改动。扩展性很好。这里需要说明的是,当用建造者模式创建出来的Meal,我们仍然可以使用addItem方法对其进行修改,但是我们不愿意做这样的事,我们希望建造者建立出来的Meal对象是确定的那样的,不被再修改,那么需要修改哪部分的代码完成这样的效果呢?
网友评论