什么是.NET建造者模式
创始人
2024-11-28 07:43:07
0次

建造者模式的定义:

将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式

建造者模式结构图:

什么是.NET建造者模式

建造者模式角色:

1 builder:为创建一个产品对象的各个部件指定抽象接口。
2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
3 Director:构造一个使用Builder接口的对象。
4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

下面通过过现实生活中的建房子的例子,来诠释建造者模式:

1.抽象出建造者接口,里面有待实现的创建房子种类的条件,创建后返回房间的数量,以及这件房子的描述信息。

 /// 
 /// 抽象建造者
 /// 
 public interface IHouse
 {
 /// 
 /// 创建房子种类的条件
 /// 
 /// 
 bool GetBackyard();

 /// 
 /// 创建的房间数
 /// 
 /// 
 long NoOfRooms();

 /// 
 /// 描述
 /// 
 /// 
 string Description();
 }

2.继承IHouse接口,具体建造者,这里创建了一件房间,里面包括客厅,厨房,洗手间,卧室,共四件房间这样一座房子。

 public class CRoom
 {
 public string RoomName { get; set; }
 }

 /// 
 /// 具体建造者
 /// 
 public class CSFH:IHouse
 {
 private bool mblnBackyard;
 private Hashtable Rooms;

 public CSFH() {
 CRoom room = new CRoom();
 room.RoomName = "一楼客厅";
 Rooms = new Hashtable();
 Rooms.Add("room1", room);

 room = new CRoom();
 room.RoomName = "一楼厨房";
 Rooms.Add("room2", room);

 room = new CRoom();
 room.RoomName = "一楼洗手间";
 Rooms.Add("room3", room);

 room = new CRoom();
 room.RoomName = "一楼卧室";
 Rooms.Add("room4",room);

 mblnBackyard = true;
 }

 public bool GetBackyard()
 {
 return mblnBackyard;
 }

 public long NoOfRooms()
 {
 return Rooms.Count;
 }

 public string Description()
 {
 IDictionaryEnumerator myEnumerator = Rooms.GetEnumerator();
 string strDescription = "这个房子共 " + Rooms.Count + " 间 \n";
 while (myEnumerator.MoveNext())
 {
 strDescription = strDescription + "\n" + myEnumerator.Key + "\t" + ((CRoom)myEnumerator.Value).RoomName; 
 }
 return strDescription;
 }
 }

3.继承IHouse接口,具体建造者,这里创建了一件房子,里面只包括卧室,客厅,厨房共三件房间这样一座房子。

 /// 
 /// 其他具体建造者
 /// 
 public class CApt:IHouse
 {
 private bool mblnBackyard;
 private Hashtable Rooms;

 public CApt()
 { 
 Rooms = new Hashtable();
 CRoom room = new CRoom();
 room.RoomName = "卧室";
 Rooms.Add("room1", room);

 room = new CRoom();
 room.RoomName = "客厅";
 Rooms.Add("room2", room);

 room = new CRoom();
 room.RoomName = "厨房";
 Rooms.Add("room3", room);

 mblnBackyard = false;
 }

 public bool GetBackyard()
 {
 return mblnBackyard;
 }
 
 public long NoOfRooms(){
 return Rooms.Count; 
 }

 public string Description(){
 IDictionaryEnumerator myEnumerator = Rooms.GetEnumerator();
 string strDescription = "这个房子一共 " + Rooms.Count + " 间 \n";
 while (myEnumerator.MoveNext())
 {
  strDescription = strDescription + "\n" + myEnumerator.Key + "\t" + ((CRoom)myEnumerator.Value).RoomName; 
 }
 return strDescription;
 }
 }

4.创建指导者,指导要求哪一个建造者去建造什么样子的房间。

 /// 
 /// 指导者
 /// 
 public class CDirector
 {
 public IHouse BuildHouse(bool blnBackyard)
 {
 if (blnBackyard)
 {
 return new CSFH();
 }
 else
 {
 return new CApt(); 
 }
 }
 }

5.创建:

 static void Main(string[] args)
 {
 CDirector objDirector = new CDirector();//实例化指导者
 IHouse objHouse;
 string Input = Console.ReadLine();//输入条件指导哪位创建者创建房间
 objHouse = objDirector.BuildHouse(bool.Parse(Input));
 Console.WriteLine(objHouse.Description());
 Console.ReadLine();
 }

建造者模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化

产品不需要抽象类,特别是由于创建对象的算法复杂而导致使用此模式的情况下或者此模式应用于产品的生成过程,其最终结果可能差异很大,不大可能提炼出一个抽象产品类。

前面的抽象工厂模式解决“系列对象”的需求变化,Builder 模式解决“对象部分”的需求变化。

建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节

每一个Builder都相对独立,而与其它的Builder无关。

建造者模式适用于需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。需要生成的产品对象有复杂的内部结构。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...