博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
极速理解设计模式系列:1.建造者模式(Builder Pattern)
阅读量:4504 次
发布时间:2019-06-08

本文共 3765 字,大约阅读时间需要 12 分钟。

4个角色:指挥者(Director),建造者(Builder),具体建造者(ConcreteBuilder),产品(Product)

         产品:需要创建的对象产品
         具体建造者:创建产品的实例并且实现建造者多个方法对产品进行装配
         建造者:本质为抽象类,里面的抽象方法供具体建造者重写,声明产品的引用
         指挥者:调用建造者抽象类以及其方法

       实现思路:客户端创建一个指挥者,并且实例化需要的产品的具体建造者,然后指挥者调用具体建造者的实例即将产品生产出来。

 类图:

       

        应用场景:在Silverlight中我们需要生产一列多行的输入框+TextBlock的组合,但是这些输入框的类型不同,有一些只能输入256个字符,有的只能输入20个字符,还有的是多行的,有的是单行的输入框。这些输入框的种类是固定的,但是可能用户自定义输入框的时候我们生成的顺序和各自的生成数量不知道。

        分析:在这里产品是固定的,有A,B,C,D,E,F六种输入框+TextBlock,用户可能生成的情况是A,A,C,C,B,B,C、也可能是B,C,D,B,C,F。这里我们使用建造者模式,这几种输入框基本上都差不多,都是TextBlock+TextBox的模式。但是可输入数量和是否多行是不定的,那么我们实现AConcreteBuilder,BConcreteBuilder,CConcreteBuilder,DConcreteBuilder,EConcreteBuilder,FConcreteBuilder等多个具体建造者,然后对于建造者中只需要两个方法分别实例化产品,并且对产品的属性(可输入字符数、是否可多行)进行设置,然后再用户需要调用什么产品的时候,使用指挥者调用想要的ConcreteBuilder具体建造者即可。

        下面我们以一个电脑产品生产的实例来具体看看Builder Pattern是如何使用的:

        一、产品角色

//
产品
class
Computer
{
private
string
m_CompName;
private
string
m_MemorySize;
private
string
m_DiskSize;
///
<summary>
///
电脑名称
///
</summary>
public
string
CompName
{
get
{
return
m_CompName; }
set
{ m_CompName
=
value; }
}
///
<summary>
///
内存大小
///
</summary>
public
string
MemorySize
{
get
{
return
m_MemorySize; }
set
{ m_MemorySize
=
value; }
}
///
<summary>
///
硬盘大小
///
</summary>
public
string
DiskSize
{
get
{
return
m_DiskSize; }
set
{ m_DiskSize
=
value; }
}
///
<summary>
///
显示产品的信息
///
</summary>
public
void
ShowComputerInfo()
{
Console.WriteLine(
"
------------------------
"
);
Console.WriteLine(
"
电脑名称:
"
+
CompName);
Console.WriteLine(
"
内存大小:
"
+
MemorySize);
Console.WriteLine(
"
硬盘大小:
"
+
DiskSize);
}
}

        二、建造者角色

//
建造者 定义建造产品的抽象方法和产品的引用
abstract
class
ComputerBuilder
{
private
Computer computerInstance;
///
<summary>
///
返回建立的电脑产品实例
///
</summary>
public
Computer ComputerInstance
{
get
{
return
computerInstance; }
set
{ computerInstance
=
value; }
}
///
<summary>
///
创建电脑名称
///
</summary>
abstract
public
void
CreateCompName();
///
<summary>
///
创建电脑内存
///
</summary>
abstract
public
void
CreateCompMemory();
///
<summary>
///
创建电脑硬盘
///
</summary>
abstract
public
void
CreateCompDisk();
}

        三、具体建造者角色

//
具体建造者创建苹果电脑
class
AppleConcreteBuilder : ComputerBuilder
{
public
override
void
CreateCompName()
{
ComputerInstance
=
new
Computer();
ComputerInstance.CompName
=
"
苹果电脑
"
;
}
public
override
void
CreateCompMemory()
{
ComputerInstance.MemorySize
=
"
4G
"
;
}
public
override
void
CreateCompDisk()
{
ComputerInstance.DiskSize
=
"
500G
"
;
}
}
//
具体建造者创建戴尔电脑
class
DellConcreteBuilder : ComputerBuilder
{
public
override
void
CreateCompName()
{
ComputerInstance
=
new
Computer();
ComputerInstance.CompName
=
"
戴尔电脑
"
;
}
public
override
void
CreateCompMemory()
{
ComputerInstance.MemorySize
=
"
2GB
"
;
}
public
override
void
CreateCompDisk()
{
ComputerInstance.DiskSize
=
"
320GB
"
;
}
}
//
具体建造者创建惠普电脑
class
HpConcreteBuilder : ComputerBuilder
{
public
override
void
CreateCompName()
{
ComputerInstance
=
new
Computer();
ComputerInstance.CompName
=
"
惠普电脑
"
;
}
public
override
void
CreateCompMemory()
{
ComputerInstance.MemorySize
=
"
1GB
"
;
}
public
override
void
CreateCompDisk()
{
ComputerInstance.DiskSize
=
"
160GB
"
;
}
}
//
具体建造者创建IBM电脑
class
IBMConcreteBuilder : ComputerBuilder
{
public
override
void
CreateCompName()
{
ComputerInstance
=
new
Computer();
ComputerInstance.CompName
=
"
IBM电脑
"
;
}
public
override
void
CreateCompMemory()
{
ComputerInstance.MemorySize
=
"
2G
"
;
}
public
override
void
CreateCompDisk()
{
ComputerInstance.DiskSize
=
"
1000G
"
;
}
}

        四、指挥者角色

//
指挥者
class
CreateDirector
{
///
<summary>
///
调用建造者抽象方法以生产产品
///
</summary>
///
<param name="compBuilder"></param>
public
void
CreateComputer(ComputerBuilder compBuilder)
{
compBuilder.CreateCompName();
compBuilder.CreateCompMemory();
compBuilder.CreateCompDisk();
}
}
        如需源码请点击  下载。

转载于:https://www.cnblogs.com/chengxingliang/archive/2011/07/14/2105119.html

你可能感兴趣的文章
Http中涉及到的知识点总结
查看>>
测试计划
查看>>
adb命令记录
查看>>
Ecstore Nginx Rewrite(去掉链接中的index.php) ECSTORE 伪静态
查看>>
Dash
查看>>
BZOJ 1876: [SDOI2009]SuperGCD
查看>>
swift初学日志
查看>>
CCF真题之出现次数最多的数
查看>>
Eclipse上GIT插件_客户端配置
查看>>
使用HANA Web-based Development Workbench创建最简单的Server Side JavaScript
查看>>
JavaScript浏览器对象之二Document对象
查看>>
算法导论 第二部分——排序和顺序统计量
查看>>
监督学习——AdaBoost元算法提高分类性能
查看>>
SharePoint 使用代码创建 SPWeb/SPSiite/SPWebApplication以及WebPart添加到页面与删除 (三)...
查看>>
[原创]在Linux系统Ubuntu14.04上安装部署docker。
查看>>
网络对抗技术 实验四
查看>>
关联Anaconda和最新Pycharm2018.3.2
查看>>
DataGridView列的宽度、行的高度自动调整
查看>>
内部网关协议 (IGP)
查看>>
概要文档知识补遗
查看>>