首页 > 其他分享 >【设计模式】建造者模式

【设计模式】建造者模式

时间:2024-07-23 15:26:29浏览次数:8  
标签:return 建造 模式 Meal Override new 设计模式 public

设计模式的分类:

        创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。

        工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式

        结构型模式:这些模式关注对象之间的组合和关系,旨在解决如何构建灵活且可复用的类和对象结构。

        适配器模式、桥接模式、过滤器模式、组合模式、装饰器模式、外观模式、享元模式、代理模式

        行为型模式:这些模式关注对象之间的通信和交互,旨在解决对象之间的责任分配和算法的封装。

        责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、空对象模式、策略模式、模板模式、访问者模式

建造者模式是一种创建型设计模式,主要目的是将一个复杂对象的构建过程与其表示相分离,从而可以创建具有不同表示形式的对象。

主要解决

在软件系统中,一个复杂对象的创建通常由多个部分组成,这些部分的组合经常变化,但组合的算法相对稳定。

应用实例

  • 去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出不同的"套餐"。
  • Java 中的 StringBuilder

优点

  • 分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。
  • 可以更好地控制构建过程,隐藏具体构建细节。
  • 代码复用性高,可以在不同的构建过程中重复使用相同的建造者。

缺点

  • 如果产品的属性较少,建造者模式可能会导致代码冗余。
  • 增加了系统的类和对象数量。

使用场景

  • 需要生成的对象具有复杂的内部结构。
  • 需要生成的对象内部属性相互依赖。

 结构

建造者模式包含以下几个主要角色:

  • 产品(Product):要构建的复杂对象。产品类通常包含多个部分或属性。

  • 抽象建造者(Builder):定义了构建产品的抽象接口,包括构建产品的各个部分的方法。

  • 具体建造者(Concrete Builder):实现抽象建造者接口,具体确定如何构建产品的各个部分,并负责返回最终构建的产品。

  • 指导者(Director):负责调用建造者的方法来构建产品,指导者并不了解具体的构建过程,只关心产品的构建顺序和方式。

实现

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 {
 
   @Override
   public String pack() {
      return "Wrapper";
   }
}
public class Bottle implements Packing {
 
   @Override
   public String pack() {
      return "Bottle";
   }
}

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

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

4、创建扩展了Burger和ClodDrink的实体类

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

5、创建一个Meal类,带有上面定义的Item对象

import java.util.ArrayList;
import java.util.List;
 
public class Meal {
   private List<Item> items = new ArrayList<Item>();    
 
   public void addItem(Item item){
      items.add(item);
   }
 
   public float getCost(){
      float cost = 0.0f;
      for (Item item : items) {
         cost += item.price();
      }        
      return cost;
   }
 
   public void showItems(){
      for (Item item : items) {
         System.out.print("Item : "+item.name());
         System.out.print(", Packing : "+item.packing().pack());
         System.out.println(", Price : "+item.price());
      }        
   }    
}

6、创建一个MealBuilder类,实际的builder类负责创建Meal对象

public class MealBuilder {
 
   public Meal prepareVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new VegBurger());
      meal.addItem(new Coke());
      return meal;
   }   
 
   public Meal prepareNonVegMeal (){
      Meal meal = new Meal();
      meal.addItem(new ChickenBurger());
      meal.addItem(new Pepsi());
      return meal;
   }
}

7、BuiderPatternDemo 使用 MealBuilder 来演示建造者模式(Builder Pattern)。

public class BuilderPatternDemo {
   public static void main(String[] args) {
      MealBuilder mealBuilder = new MealBuilder();
 
      Meal vegMeal = mealBuilder.prepareVegMeal();
      System.out.println("Veg Meal");
      vegMeal.showItems();
      System.out.println("Total Cost: " +vegMeal.getCost());
 
      Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
      System.out.println("\n\nNon-Veg Meal");
      nonVegMeal.showItems();
      System.out.println("Total Cost: " +nonVegMeal.getCost());
   }
}

标签:return,建造,模式,Meal,Override,new,设计模式,public
From: https://blog.csdn.net/weixin_61144851/article/details/140635144

相关文章

  • 设计模式-状态模式(State pat)
    设计模式-策略模式(StatePattern)  概要   记忆关键词:状态变成类  定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。  状态模式结构图如下:    一、能解决什么问题?  它主要用来解决对象在多种状态转换时,需要对外输出不同......
  • 【Java常用设计模式】通俗易懂的玩转单例、建造者、工厂、策略模式(保姆篇)
    文章目录单例模式建造者模式工厂模式策略模式本篇小结更多相关内容可查看在一个狂风骤雨的下午,有人突然问了我一句,单例模式是什么,我愣了,相信看完这篇就不会愣了,本文以通俗易懂的方式写的,可能有不严谨的地方......
  • 多模态大模型主流架构模式的演化历程
    多模态大模型主流架构模式的演化历程一、引言近年来,随着深度学习技术的飞速发展,多模态学习逐渐成为人工智能领域的研究热点。与单一模态不同,多模态学习旨在利用不同模态数据(如文本、图像、音频等)之间的互补信息,构建更加全面、准确的智能模型。多模态融合是实现多模......
  • SplObserver 和 SplSubject 接口实现观察者模式
    <?phpclassSubjectimplementsSplSubject{private$observers=[];private$state;publicfunctionattach(SplObserver$observer){$this->observers[]=$observer;}publicfunctiondetach(SplObserver$observer){......
  • LSI-9361-RAID卡如何解除安全模式?
    一、故障现象RAID卡进入安全模式导致系统无法引导成功。(如下截图)图一二、恢复安全模式方案1、 进入 BIOS 配置,然后选择 Advanced,再选中 AVAGOMegaRAID。图二2、MainMenu回车进入图三3、选择ControllerManagement回车进入图四4、选择AdvancedContr......
  • 事件处理模式
    事件处理模式reactor模式reactor是一种事件处理模式,出现要解决的问题是要将原本IO管理转变为更关心事件管理,每个事件发生的时候调用回调函数进行处理。构成register注册事件callback回调函数包括io,event,callback,rbuffer,wbuffer需要注意的是event和call_back对应......
  • WCH-LinkW无线下载仿真调试器&无线串口通信(主/从机模式)-RISC-V/ARM内核MCU无线DAP下
    LinkW-1V1 主机 硬创社搜索(WCH-LinkW):WCH-LinkW无线下载仿真调试器-硬创社 板载PCB天线:2.4G板载天线AD库资源-CSDN文库简介: WCH-LinkW无线下载仿真调试器&无线串口通信(主/从机模式)。应用场景: 1、用于RISC-V/ARM内核MCU无线DAP下载仿真调试器2、......
  • 生产者消费者设计模式
    生产者消费者设计模式学习一、什么是生产者消费者设计模式Java中的生产者-消费者设计模式是一种用于多线程编程的经典设计模式,它用于解决多个线程之间共享资源时的同步和通信问题。这个模式主要用在有数据生产者(Producer)和数据消费者(Consumer)的场景中,生产者负责产生数据,而消费者......
  • 职责链、命令和观察者设计模式的区别
    职责链、命令和观察者是三种不同的设计模式,它们各自解决不同类型的问题。下面分别介绍这三种设计模式的特点和区别:1.职责链模式(ChainofResponsibility)定义:职责链模式是一种行为设计模式,它通过将请求的处理者组织成一个链,使得请求可以沿这条链传递,直到有一个处理者处理......
  • (笔记)深入解读EtherCAT时钟DC同步的三种模式
     一、DC同步原理     用EtherCAT的分布式时钟(DC)功能使从站设备同步指的是,总线中的第一个DC从站被定义为基准时钟,EtherCAT主站将基准时钟的时间分配至所有的从站。因此,EtherCAT主站周期性发送一个ARMW命令,以此读取存储在时钟主站的ESC(EtherCAT从站控制器)上适当的寄存......