创建型——建造者模式

推荐文档:

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 }
复制代码
posted @   不爱菠萝的菠萝君  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
主题色彩
点击右上角即可分享
微信分享提示