设计模式之——建造者模式

喜欢ヅ旅行 2023-06-26 08:23 8阅读 0赞

前言:

建造者模式(Builder Pattern)提供了一种创建对象的最佳方式。它创建对象的过程是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

特点:

  1. 创建对象不必知道对象内部组成的细节。
  2. 具体的建造者类之间是相互独立的,有利于系统的扩展。
  3. 过程逐步细化,而不会对其他模块产生任何影响,便于控制细节风险。

实现:

需求:客人向店长点两个汤,一份西红柿鸡蛋汤,一份紫菜蛋花汤。店里呢,有个专业做西红柿鸡蛋汤的,有个专业做紫菜蛋花汤的(别问我为啥不是一个厨师做,因为术业有专攻嘛),店长不关心汤具体怎么做的(领导肯定只在乎结果,过程关他屁事),他只要向后厨(店里请了两个专业大厨)说一声,那么厨师听到了以后自然会去煲自己负责的汤。然后煲好了给店长就行了。

分析实现:

1:创建汤的父类(Soup),创建西红柿鸡蛋汤(XIHongShiJiDanSoup)类继承父类(Soup),创建紫菜蛋花汤(ZiCaiDanHuaSoup)类继承父类(Soup)。并分别在子类中实现自己需要的食材和制作方法。

2:创建做汤的抽象接口(SoupBuild),定义煲汤的方法:makeSoup();返回值汤(Soup)。创建西红柿蛋花汤专业厨师长(XiHongShiJiDanSoupBuilder)继承SoupBuild接口,并实现煲汤的方法。创建紫菜蛋花汤专业厨师长(ZiCaiDanHuaSoupBuilder)继承SoupBuild接口,并实现煲汤的方法。

3:得到需要的汤。

4:使用测试类进行测试

建造者模式实现:

项目结构图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RyZWFtX3h1bg_size_16_color_FFFFFF_t_70

相关类源码:

汤的父类Soup

  1. **
  2. * 汤的父类
  3. */
  4. public class Soup {
  5. }

西红柿鸡蛋汤类XIHongShiJiDanSoup

  1. /**
  2. *西红柿鸡蛋汤实体类,继承Soup类
  3. * 类中逻辑实现均以打印的内容代替
  4. */
  5. public class XIHongShiJiDanSoup extends Soup{
  6. //其实以下这些方法中应该是创建对应的对象,并使用要有的对象完成赋值或其他事,具体逻辑需要自己去实现
  7. public void daJiDan(){
  8. System.out.println("打两个鸡蛋,搅拌均匀");
  9. }
  10. public void qieXiHongShi(){
  11. System.out.println("洗干净西红柿切好做准备");
  12. }
  13. public void fanChao(){
  14. System.out.println("鸡蛋和西红柿炒拌均匀");
  15. }
  16. public void jiaShui(){
  17. System.out.println("加入水煲一会");
  18. }
  19. public void jiaTiaoLiao(){
  20. System.out.println("加调料");
  21. }
  22. }

紫菜蛋花汤类ZiCaiDanHuaSoup

  1. /**
  2. *紫菜蛋花汤实体类,继承Soup类
  3. * 类中逻辑实现均以打印的内容代替
  4. */
  5. public class ZiCaiDanHuaSoup extends Soup{
  6. public void zhenBeiZiCai(){
  7. System.out.println("清洗干净紫菜做准备");
  8. }
  9. public void shaoShui(){
  10. System.out.println("烧开水");
  11. }
  12. public void xiaZiCai(){
  13. System.out.println("紫菜下锅");
  14. }
  15. public void xiaJiDan(){
  16. System.out.println("慢慢倒入搅拌均匀的鸡蛋");
  17. }
  18. public void jiaTiaoLiao(){
  19. System.out.println("出锅");
  20. }
  21. }

抽象煲汤大厨接口SoupBuilder

  1. public interface SoupBuild {
  2. public Soup makeSoup();
  3. }

西红柿鸡蛋汤专业制作大厨XiHongShiJiDanSoupBuilder

  1. /**
  2. * 西红柿鸡蛋汤专业制作大厨,继承煲汤SoupBuild接口
  3. * 因为大厨是专业煲西红柿鸡蛋汤的嘛,所以肯定是胸有成竹。哦,不对
  4. * 这里是胸有西红柿鸡蛋汤 XIHongShiJiDanSoup "武功秘籍"的
  5. */
  6. public class XiHongShiJiDanSoupBuilder implements SoupBuild{
  7. private XIHongShiJiDanSoup xiHongShiJiDanSoup = new XIHongShiJiDanSoup();
  8. @Override
  9. public Soup makeSoup() {
  10. System.out.println("开始制作西红柿鸡蛋汤!");
  11. xiHongShiJiDanSoup.daJiDan();
  12. xiHongShiJiDanSoup.qieXiHongShi();
  13. xiHongShiJiDanSoup.fanChao();
  14. xiHongShiJiDanSoup.jiaShui();
  15. xiHongShiJiDanSoup.jiaTiaoLiao();
  16. return xiHongShiJiDanSoup;
  17. }
  18. }

紫菜蛋花汤专业制作大厨:ZiCaiDanHuaSoupBuilder

  1. /**
  2. * 紫菜蛋花汤专业制作大厨,继承煲汤SoupBuild接口
  3. * 因为大厨是专业煲紫菜蛋花汤的嘛,所以肯定是胸有成竹。哦,不对
  4. * 这里是胸有紫菜蛋花汤 XIHongShiJiDanSoup "武功秘籍"的
  5. */
  6. public class ZiCaiDanHuaSoupBuilder implements SoupBuild{
  7. private ZiCaiDanHuaSoup ziCaiDanHuaSoup = new ZiCaiDanHuaSoup();
  8. @Override
  9. public Soup makeSoup() {
  10. System.out.println("开始制作紫菜蛋花蛋汤!");
  11. ziCaiDanHuaSoup.zhenBeiZiCai();
  12. ziCaiDanHuaSoup.shaoShui();
  13. ziCaiDanHuaSoup.xiaZiCai();
  14. ziCaiDanHuaSoup.xiaJiDan();
  15. ziCaiDanHuaSoup.jiaTiaoLiao();
  16. return ziCaiDanHuaSoup;
  17. }
  18. }

指挥者类,俗称店长,老大Director

  1. /**
  2. * 指挥者类,俗称店长,老大
  3. * 老大后厨中私藏了两个煲汤专业户XiHongShiJiDanSoupBuilder,ZiCaiDanHuaSoupBuilder
  4. */
  5. public class Director {
  6. private XiHongShiJiDanSoupBuilder xiHongShiJiDanSoupBuilder = new XiHongShiJiDanSoupBuilder();
  7. private ZiCaiDanHuaSoupBuilder ziCaiDanHuaSoupBuilder = new ZiCaiDanHuaSoupBuilder();
  8. public XIHongShiJiDanSoup makeXiHongShiJiDanSoup(){
  9. System.out.println("厨师要开始做西红柿鸡蛋汤了!");
  10. return (XIHongShiJiDanSoup) xiHongShiJiDanSoupBuilder.makeSoup();
  11. }
  12. public ZiCaiDanHuaSoup makeZiCaiDanHuaSoup(){
  13. System.out.println("厨师要开始做紫菜蛋花汤了!");
  14. return (ZiCaiDanHuaSoup) ziCaiDanHuaSoupBuilder.makeSoup();
  15. }
  16. }

测试:

  1. /**
  2. * 测试类,指挥者(店长)指挥做什么汤就好了,就等着出结果吧
  3. */
  4. public class TestMain {
  5. public static void main(String[] args) {
  6. Director director = new Director();
  7. //指挥做西红柿鸡蛋汤
  8. XIHongShiJiDanSoup xiHongShiJiDanSoup = director.makeXiHongShiJiDanSoup();
  9. System.out.println("///");
  10. //指挥做紫菜蛋花汤
  11. ZiCaiDanHuaSoup ziCaiDanHuaSoup = director.makeZiCaiDanHuaSoup();
  12. }
  13. }

测试结果:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RyZWFtX3h1bg_size_16_color_FFFFFF_t_70 1

总结:

从上面例子中,可以看出创建者(Director)可以把本来强依赖的东西解绑,解决了依赖问题,还提高了封装性。创建对象不必知道对象内部组成的细节,就可以得到一个“成品”。隐藏了复杂对象(XIHongShiJiDanSoup,ZiCaiDanHuaSoup)的创建过程,它把复杂对象的创建过程加以抽象(SoupBuild进行抽象),通过子类(XiHongShiJiDanSoupBuilder)继承或者重载的方式,动态的创建具有复合属性的对象(这里的XIHongShiJiDanSoup应该该是有一些属性的,为了代码量低,所以没写)。通过建造者模式,保证了每种汤的制作顺序和过程。

建造者模式与抽象工厂模式的比较:

  • 与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族 。
  • 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象 。
  • 如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽

发表评论

表情:
评论列表 (有 0 条评论,8人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式建造模式

    建造者模式也是创建型模式中的一种,所谓的创建型模式,指的是如何创建对象,关注的是对象的创建过程。 建造者模式是将一个复杂对象分解成多个相对简单的子模块进行创建,比如游戏中常见

    相关 设计模式——建造模式

    > 设计模式: > > 前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定。而是一套用来提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案