建造者模式 - Builder 生成器模式
2014-02-18 18:04
309 查看
建造者模式(Builder),也叫生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造小人的代码实现
abstract class PersonBuilder
{
protected Graphics g;
protected Pen p;
public PersonBuild(Graphics g,Pen p)
{
this.g = g;
this.p = p;
}
public abstract void BuildHead();
public abstract void BuildBody();
public abstract void BuildOther();
}
class PersonThinBuilder : PersonBuilder
{
public PersonThinBuilder(Graphics g,Pen p) : base(g,p)
{}
public override void BuildHead()
{
g.DrawEllipse(p,50,20,30,30);
}
public override void BuildBody()
{
g.DrawRectangle(p,60,50,10,50);
}
public override void BuildOther()
{
g.DrawRectangle(p,60,50,10,50);
}
}
//建造的指挥者类
class PersonDirector
{
private PersonBuilder pb;
public PersonDirector(PersonBuilder pb)
{
this.pb = pb;
}
public void CreatePerson()
{
pb.BuildHead();
pb.BuildBody();
pb.BuildOther();
}
}
PersonDirector 类的目的就是根据用户的选择来一步一步建造小人,而建造的过程在指挥者这里就完成了,用户不需要知道,而且这个过程是每一步都是是一定要做的,那就不会让少画一只手,小画一条腿的问题出现。
---客户端代码---
Pen p = new Pen(Color.Yellow);
PersonThinBuilder ptb = new PersonThinBuilder(pictureBox1.CreateGraphics(),p);
PersonDirector pdThin = new PersonDirector(ptd);
pdThin.CreatePerson();
建造者模式结构图:
建造者模式基本代码
Product 类
class Product
{
IList<string> parts = new List<string>();
//添加产品部件
public void Add(string part)
{
parts.Add(part);
}
public void Show()
{
Console.WriteLine("\n 产品创建 ---");
foreach(string part in parts)
{
Console.WriteLine(part);
}
}
}
Builder类 抽象建造者,确定产品同两个部件PartA,PartB组成,并声明一个得到产品建造后结果的方法GetResult
abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
class ConcreteBuilder1 : Builder
{
private Product product = new Product();
public override void BuildPartA()
{
product.Add("部件A");
}
public override void BuildPartB()
{
product.Add("部件B");
}
public override Product GetResult()
{
return product;
}
}
指挥者类
class Director
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
---客户端代码---
static void Main(string[] args)
{
Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
director.Construct(b1);
Product p1 = b1.GetResult();
p1.Show();
Console.Read();
}
所以说,建造者模式是当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式方式时适用的模式.
建造小人的代码实现
abstract class PersonBuilder
{
protected Graphics g;
protected Pen p;
public PersonBuild(Graphics g,Pen p)
{
this.g = g;
this.p = p;
}
public abstract void BuildHead();
public abstract void BuildBody();
public abstract void BuildOther();
}
class PersonThinBuilder : PersonBuilder
{
public PersonThinBuilder(Graphics g,Pen p) : base(g,p)
{}
public override void BuildHead()
{
g.DrawEllipse(p,50,20,30,30);
}
public override void BuildBody()
{
g.DrawRectangle(p,60,50,10,50);
}
public override void BuildOther()
{
g.DrawRectangle(p,60,50,10,50);
}
}
//建造的指挥者类
class PersonDirector
{
private PersonBuilder pb;
public PersonDirector(PersonBuilder pb)
{
this.pb = pb;
}
public void CreatePerson()
{
pb.BuildHead();
pb.BuildBody();
pb.BuildOther();
}
}
PersonDirector 类的目的就是根据用户的选择来一步一步建造小人,而建造的过程在指挥者这里就完成了,用户不需要知道,而且这个过程是每一步都是是一定要做的,那就不会让少画一只手,小画一条腿的问题出现。
---客户端代码---
Pen p = new Pen(Color.Yellow);
PersonThinBuilder ptb = new PersonThinBuilder(pictureBox1.CreateGraphics(),p);
PersonDirector pdThin = new PersonDirector(ptd);
pdThin.CreatePerson();
建造者模式结构图:
建造者模式基本代码
Product 类
class Product
{
IList<string> parts = new List<string>();
//添加产品部件
public void Add(string part)
{
parts.Add(part);
}
public void Show()
{
Console.WriteLine("\n 产品创建 ---");
foreach(string part in parts)
{
Console.WriteLine(part);
}
}
}
Builder类 抽象建造者,确定产品同两个部件PartA,PartB组成,并声明一个得到产品建造后结果的方法GetResult
abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
class ConcreteBuilder1 : Builder
{
private Product product = new Product();
public override void BuildPartA()
{
product.Add("部件A");
}
public override void BuildPartB()
{
product.Add("部件B");
}
public override Product GetResult()
{
return product;
}
}
指挥者类
class Director
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
---客户端代码---
static void Main(string[] args)
{
Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
director.Construct(b1);
Product p1 = b1.GetResult();
p1.Show();
Console.Read();
}
所以说,建造者模式是当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式方式时适用的模式.
相关文章推荐
- 对话框菜单不响应UPDATE_COMMAND_UI
- UI篇--Android中TableLayout中的布局
- windows下执行build_native.sh报权限问题
- UITabBar的简单使用
- android 自动化测试的傻瓜实践之旅(UI篇) -----小试身手
- 最长递增子序列(Longest Increase Subsequence)
- STL之queue
- 通过UIView对象获取该对象所属的UIViewController
- 怎么用代码判断Android手机的Rom是MIUI及获取MIUI版本
- [Android Studio]build新工程的时候卡住问题解决
- ios7上UITableview索引遮挡searchbar问题解决办法
- 简单模仿易信UI
- 禁止UITextView的copy,cut操作
- Bug 3402490 : QUERY TO DBA_JOBS_RUNNING TAKES
- NGUI控件说明(中文) UIStretch
- 隐藏软键盘windowtoken null
- A simple quickref for Eigen
- UIViewContentMode
- 《STL源码剖析》deque的实现
- Confluence 5.4 新特性