首页 > 其他分享 >创建型——建造者模式

创建型——建造者模式

时间:2023-05-27 16:45:36浏览次数:55  
标签:return string 创建 建造 模式 Meal Item public

推荐文档:

https://www.cnblogs.com/zhili/p/DesignPatternSummery.html

https://www.runoob.com/design-pattern/design-pattern-tutorial.html

什么是建造者模式?

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

相关介绍

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例

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

2、JAVA 中的 StringBuilder。

优点

1、建造者独立,易扩展。

2、便于控制细节风险。

缺点

1、产品必须有共同点,范围有限制。

2、如内部变化复杂,会有很多的建造类。

使用场景

1、需要生成的对象具有复杂的内部结构。

2、需要生成的对象内部属性本身相互依赖。

注意事项

与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

相关实现

我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。

我们将创建一个表示食物条目(比如汉堡和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。

然后我们创建一个 Meal 类,带有 Item 的 ArrayList 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilder。BuilderPatternDemo 类使用 MealBuilder 来创建一个 Meal。

 

  1 namespace Biao.DesignPatterns.CreationalPatterns
  2 {
  3     /// <summary>
  4     /// 创建一个表示食物条目的接口
  5     /// </summary>
  6     public interface Item
  7     {
  8         public string Name();
  9         public IPacking Packing();
 10         public float Price();
 11     }
 12 
 13     /// <summary>
 14     /// 创建一个表示食物包装的接口
 15     /// </summary>
 16     public interface IPacking
 17     {
 18         public string Pack();
 19     }
 20 
 21     /// <summary>
 22     /// 实现Packing接口的实体类Warpper
 23     /// </summary>
 24     public class Warpper : IPacking
 25     {
 26         public string Pack()
 27         {
 28             return "Warpper";
 29         }
 30     }
 31 
 32     /// <summary>
 33     /// 实现Packing接口的实体类Bottle
 34     /// </summary>
 35     public class Bottle : IPacking
 36     {
 37         public string Pack()
 38         {
 39             return "Bottle";
 40         }
 41     }
 42 
 43     /// <summary>
 44     /// 创建实现Item接口的抽象类Burger,该类提供默认功能
 45     /// </summary>
 46     public abstract class Burger : Item
 47     {
 48         public abstract string Name();
 49 
 50         public IPacking Packing()
 51         {
 52             return new Warpper();
 53         }
 54 
 55         public abstract float Price();
 56     }
 57 
 58     /// <summary>
 59     /// 创建实现Item接口的抽象类ColdDrink,该类提供默认功能
 60     /// </summary>
 61     public abstract class ColdDrink : Item
 62     {
 63         public abstract string Name();
 64 
 65         public IPacking Packing()
 66         {
 67             return new Bottle();
 68         }
 69 
 70         public abstract float Price();
 71     }
 72 
 73     /// <summary>
 74     /// 创建扩展Burger抽象类的实体类VegBurger
 75     /// </summary>
 76     public class VegBurger : Burger
 77     {
 78         public override string Name()
 79         {
 80             return "VegBurger";
 81         }
 82 
 83         public override float Price()
 84         {
 85             return 25.0f;
 86         }
 87     }
 88 
 89     /// <summary>
 90     /// 创建扩展Burger抽象类的实体类ChickenBurger
 91     /// </summary>
 92     public class ChickenBurger : Burger
 93     {
 94         public override string Name()
 95         {
 96             return "ChickenBurger";
 97         }
 98 
 99         public override float Price()
100         {
101             return 30.0f;
102         }
103     }
104 
105     /// <summary>
106     /// 创建扩展ColdDrink抽象类的实体类Coke
107     /// </summary>
108     public class Coke : ColdDrink
109     {
110         public override string Name()
111         {
112             return "Coke";
113         }
114 
115         public override float Price()
116         {
117             return 30.0f;
118         }
119     }
120 
121     /// <summary>
122     /// 创建扩展ColdDrink抽象类的实体类Orangejuice
123     /// </summary>
124     public class Orangejuice : ColdDrink
125     {
126         public override string Name()
127         {
128             return "Orangejuice";
129         }
130 
131         public override float Price()
132         {
133             return 28.0f;
134         }
135     }
136 
137     /// <summary>
138     /// 创建一个 Meal 类,带有上面定义的 Item 对象。
139     /// </summary>
140     public class Meal
141     {
142         private List<Item> items = new List<Item>();
143 
144         public void AddItem(Item item)
145         {
146             items.Add(item);
147         }
148 
149         public float GetCost()
150         {
151             float cost = 0.0f;
152             foreach (Item item in items)
153             {
154                 cost += item.Price();
155             }
156             return cost;
157         }
158 
159         public void ShowItems()
160         {
161             foreach (Item item in items)
162             {
163                 Console.WriteLine("Item:" + item.Name() + ", Packing:" + item.Packing().Pack() + ", Price:" + item.Price());
164             }
165         }
166     }
167 
168     /// <summary>
169     /// 创建一个 MealBuilder 类,实际的 builder 类负责创建 Meal 对象。
170     /// </summary>
171     public class MealBuilder
172     {
173         public Meal PrepareVegMeal()
174         {
175             Meal meal = new Meal();
176             meal.AddItem(new VegBurger());
177             meal.AddItem(new Coke());
178             return meal;
179         }
180 
181         public Meal PrepareNonVegMeal()
182         {
183             Meal meal = new Meal();
184             meal.AddItem(new ChickenBurger());
185             meal.AddItem(new Orangejuice());
186             return meal;
187         }
188     }
189 }
190  
191 
192 static void TestBuilderPattern()
193 {
194     Console.WriteLine("---------------测试建造者模式-------------");
195     MealBuilder mealBuilder = new MealBuilder();
196     Meal vegMeal = mealBuilder.PrepareVegMeal();
197     Console.WriteLine("VegMeal");
198     vegMeal.ShowItems();
199     Console.WriteLine("Total Cost:" + vegMeal.GetCost());
200 
201     Meal nonVegMeal = mealBuilder.PrepareNonVegMeal();
202     Console.WriteLine("NonVegMeal");
203     nonVegMeal.ShowItems();
204     Console.WriteLine("Total Cost:" + nonVegMeal.GetCost());
205 }

标签:return,string,创建,建造,模式,Meal,Item,public
From: https://www.cnblogs.com/swbna/p/17436950.html

相关文章

  • 创建型——原型模式
    推荐文档:https://www.cnblogs.com/zhili/p/DesignPatternSummery.htmlhttps://www.runoob.com/design-pattern/design-pattern-tutorial.html什么是原型模式?原型模式(PrototypePattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创......
  • 结构型——适配器模式
    推荐文档:https://www.cnblogs.com/zhili/p/DesignPatternSummery.htmlhttps://www.runoob.com/design-pattern/design-pattern-tutorial.html什么是适配器模式?适配器模式(AdapterPattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立......
  • 设计模式概述
    推荐文档:https://www.cnblogs.com/zhili/p/DesignPatternSummery.htmlhttps://www.runoob.com/design-pattern/design-pattern-tutorial.html为什么要使用设计模式?使用设计模式的根本原因是适应变化,为了增加代码复用率,是软件更具有维护性和可扩展性。设计原则单一职责原则......
  • 创建型——单例模式
    推荐文档:https://www.cnblogs.com/zhili/p/DesignPatternSummery.htmlhttps://www.runoob.com/design-pattern/design-pattern-tutorial.html什么是单例模式?单例模式(SingletonPattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方......
  • 设计模式之备忘录(Memento)
    概述备忘录模式(MementoPattern),是行为型模式设计模式之一,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态。备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外部访问,目的是为了保护被保存的这些对象状态的完整性以及内部实现不向外暴露,本篇博客,我们就来......
  • 网安--vmware三种网络模式
    三、vmare三种网络模式三种模式:桥接模式、NAT模式、仅主机模式三种设备:网卡、路由器(充当网关宽展接口划分vlan)、交换机(局域网中的机器接入到一个网络中)vmnet0(桥接模式)、vmnet1(仅主机模式)、vmnet8(NAT模式)让相同网络模式的主机相互连接虚拟网卡:让主机与虚拟机连接起来1、主机......
  • ubuntu 20.4 安装msyql+创建mysql用户
    sudoapt-getupdatesudoapt-getupgratesudoaptinstallmysql-server设置运行远程访问修改:sudovim/etc/mysql/mysql.conf.d/mysqld.cnf用#注释掉bind-address=127.0.0.1进入mysql创建用户mysql-uroot-pCREATEUSER'test'@'%'IDENTIFIEDBY'12345......
  • 单例模式
    1、创建一个类将无参构造器变成私有权限(有两种实现方式)点击查看代码packagecom.bh.test;publicclassPerson{//(2)//privatestaticPersonperson;//将person变量定义成静态变量,因为getInstance()为静态方法只能调用静态变量privatestaticPersonp......
  • 行业报告 | AIGC应用与实践展望报告:人工智能重塑内容产业的作业模式
    原创|BFT机器人前言Introduction不可否认AIGC的出现似乎已经让大家预见了Al应用的拐点,其创造性与智能性一夜之间刷新了大众认知。但去伪存真,在市场火爆的背后其真正的应用及商业价值几何,更待我们冷静地剖析。01概念重生:AIGC是内容生成方式一次进化缘起于GC,而归于AI,AIGC的关键是A......
  • 设计模式-观察者模式(Observer)
    一、 观察者(Observer)模式观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通......