登录  /  注册

.NET建造者模式讲解

高洛峰
发布: 2016-12-12 17:58:09
原创
1256人浏览过

建造者模式的定义:

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

建造者模式结构图:

.NET建造者模式

建造者模式角色:

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

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

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

/// <summary>
/// 抽象建造者
/// </summary>
public interface IHouse
{
/// <summary>
/// 创建房子种类的条件
/// </summary>
/// <returns></returns>
bool GetBackyard();
 
/// <summary>
/// 创建的房间数
/// </summary>
/// <returns></returns>
long NoOfRooms();
 
/// <summary>
/// 描述
/// </summary>
/// <returns></returns>
string Description();
}
登录后复制

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

public class CRoom
{
public string RoomName { get; set; }
}
 
/// <summary>
/// 具体建造者
/// </summary>
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接口,具体建造者,这里创建了一件房子,里面只包括卧室,客厅,厨房共三件房间这样一座房子。

/// <summary>
/// 其他具体建造者
/// </summary>
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.创建指导者,指导要求哪一个建造者去建造什么样子的房间。

/// <summary>
/// 指导者
/// </summary>
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无关。

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

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号