博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式一:建造者模式(Builder Pattren)
阅读量:4555 次
发布时间:2019-06-08

本文共 3745 字,大约阅读时间需要 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/jsping/archive/2012/09/28/2706571.html

你可能感兴趣的文章
[C#] SHA1校验函数用法
查看>>
linux 下 VMware 提示Unable to change virtual machine power state:
查看>>
洛谷P1585 魔法阵
查看>>
线程 题待做
查看>>
PL/SQL可以连oracle,但是jdbc连不上 【转】
查看>>
使用 highlight.js 在网页中高亮显示java 代码 【原】
查看>>
[转]高颜值、好用、易扩展的微信小程序 UI 库,Powered by 有赞
查看>>
[转]SQL Server如何启用xp_cmdshell组件
查看>>
[转]微擎应用笔记3--manifest.xml文件使用说明
查看>>
Codeforces 1000C Covered Points Count 【前缀和优化】
查看>>
python高效读取文件、文件改写
查看>>
gulp
查看>>
pgsql查询优化之模糊查询
查看>>
[转]-Gradle使用手册(三):构建任务
查看>>
ExtJS下拉树
查看>>
android 调用系统相机录像并保存
查看>>
BW系统表的命名规则
查看>>
Asp.Net在IE10下出现_doPostBack未定义的解决办法 LinkButton
查看>>
《CLR via C#》Part2之Chapter5 基元类型、引用类型和值类型(一)
查看>>
1-9 RHEL7-文件权限管理
查看>>