Builder生成器(创建型模式)
来源:互联网 发布:英语口语句型 知乎 编辑:程序博客网 时间:2024/05/18 02:24
l 假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各个部分要富于变化。
l 如果使用最直观的设计方法,每一个房屋部分的变化,都将导致房屋构建的重新修正……
动机:
在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?
意图:
将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
Builder模式的几个要点
l Builder模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
l 变化点在哪里,封装哪里——Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动。
l Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。Builder模式通常和Composite模式组合使用。
先创建一个MultiChoice接口,它定义了需要实现的方法。
MultiChoice.cs代码示例:
using System.Collections ;
using System.Windows.Forms;
/// <summary>
/// Summary description for MultiChoice.
/// </summary>
public interface MultiChoice
{
ArrayList getSelected();
void clear();
Panel getWindow();
}
getWindows方法返回一个包含多选显示的面板(Panel),这里使用两个显示面板实现该界面:
一个是复选框面板,一个是列表框面板。
CheckChoice.cs代码示例:
using System.Collections ;
using System.Windows.Forms ;
using System.Drawing ;
//returns a panel of 0 to 3 check boxes
public class CheckChoice:MultiChoice {
private ArrayList stocks;
private Panel panel;
private ArrayList boxes;
//------
public CheckChoice(Equities stks) {
stocks = stks.getNames ();
panel = new Panel ();
boxes = new ArrayList ();
//add the check boxes to the panel
for (int i=0; i< stocks.Count; i++) {
CheckBox ck = new CheckBox ();
//position them
ck.Location = new Point (8, 16 + i * 32);
string stk = (string)stocks[i];
ck.Text =stk;
ck.Size = new Size (112, 24);
ck.TabIndex =0;
ck.TextAlign = ContentAlignment.MiddleLeft ;
boxes.Add (ck);
panel.Controls.Add (ck);
}
}
//------
//uncheck all check boxes
public void clear() {
for(int i=0; i< boxes.Count; i++) {
CheckBox ck = (CheckBox)boxes[i];
ck.Checked =false;
}
}
//------
//return list of checked items
public ArrayList getSelected() {
ArrayList sels = new ArrayList ();
for(int i=0; i< boxes.Count ; i++) {
CheckBox ck = (CheckBox)boxes[i];
if (ck.Checked ) {
sels.Add (ck.Text );
}
}
return sels;
}
//------
//return panel of checkboxes
public Panel getWindow() {
return panel;
}
}
ListChoice.cs代码示例:
using System.Collections ;
using System.Windows.Forms ;
using System.Drawing ;
/// <summary>
/// Summary description for ListChoice.
/// </summary>
/// creates a Panel containing a list box
public class ListChoice:MultiChoice {
private ArrayList stocks;
private Panel panel;
private ListBox list;
//------
//constructor creates and loads the list box
public ListChoice(Equities stks) {
stocks = stks.getNames ();
panel = new Panel ();
list = new ListBox ();
list.Location = new Point (16, 0);
list.Size = new Size (120, 160);
list.SelectionMode =SelectionMode.MultiExtended ;
list.TabIndex =0;
panel.Controls.Add (list);
for(int i=0; i< stocks.Count ; i++) {
list.Items.Add (stocks[i]);
}
}
//returns the Panel
//------
public Panel getWindow() {
return panel;
}
//returns an array of selected elements
//------
public ArrayList getSelected() {
ArrayList sels = new ArrayList ();
ListBox.SelectedObjectCollection coll = list.SelectedItems ;
for(int i=0; i< coll.Count; i++) {
string item = (string)coll[i];
sels.Add (item );
}
return sels;
}
//------
//clear selected elements
public void clear() {
list.Items.Clear();
}
}
接下来创建一个抽象基类Equities,并由它派生出Stocks,Bonds和Mutuals类。
Equities.cs代码示例:
using System.Collections ;
/// <summary>
/// Summary description for Equities.
/// </summary>
public abstract class Equities {
protected ArrayList array;
public abstract string ToString();
//----------
public ArrayList getNames() {
return array;
}
//----------
public int count() {
return array.Count ;
}
}
Stock.cs代码示例:
using System.Collections ;
/// <summary>
/// Summary description for Stocks.
/// </summary>
public class Stocks:Equities {
public Stocks() {
array = new ArrayList();
array.Add ("Cisco");
array.Add ("Coca Cola");
array.Add ("GE");
array.Add ("Harley Davidson");
array.Add ("IBM");
array.Add ("Microsoft");
}
public override string ToString() {
return "Stocks";
}
}
Bonds.cs代码示例:
using System.Collections ;
/// <summary>
/// Summary description for Bonds.
/// </summary>
public class Bonds:Equities
{
public Bonds()
{
array = new ArrayList();
array.Add ("CT GO 2005");
array.Add ("NY GO 2012");
array.Add ("GE Corp Bonds");
}
public override string ToString() {
return "Bonds";
}
}
Mutuals.cs代码示例:
using System.Collections ;
/// <summary>
/// Summary description for Mutuals.
/// </summary>
public class Mutuals:Equities
{
public Mutuals()
{
array = new ArrayList();
array.Add ("Fidelity Magellan");
array.Add ("Lindner");
array.Add ("T Rowe Price");
array.Add ("Vanguard Primecap");
}
public override string ToString() {
return "Mutuals";
}
}
StockFactory.cs代码示例:
/// <summary>
/// Summary description for StockFactory.
/// </summary>
public class StockFactory
{
public static MultiChoice getBuilder(Equities stocks)
{
if (stocks.count ()<=3) {
return new CheckChoice (stocks);
}
else {
return new ListChoice(stocks);
}
}
}
确定是返回一个复选框面板还是一个列表框面板。
private ListBox lsEquities;
/// <summary>
/// Required designer variable.
/// </summary>
private Container components = null;
private Button btPlot;
private Panel pnl;
private MultiChoice mchoice;
private void init() {
lsEquities.Items.Add (new Stocks());
lsEquities.Items.Add (new Bonds());
lsEquities.Items.Add (new Mutuals());
}
public WealthBuilder()
{
InitializeComponent();
init();
}
}
private void lsEquities_SelectedIndexChanged(object sender, System.EventArgs e) {
int i = lsEquities.SelectedIndex ;
Equities eq = (Equities)lsEquities.Items[i];
mchoice= StockFactory.getBuilder (eq);
this.Controls.Remove (pnl);
pnl = mchoice.getWindow ();
setPanel();
}
private void btPlot_Click(object sender, System.EventArgs e) {
//display the selected items in a message box
if(mchoice != null) {
ArrayList ar = mchoice.getSelected ();
string ans = "";
for(int i=0; i< ar.Count ; i++) {
ans += (string)ar[i] +" ";
}
MessageBox.Show (null, ans, "Selected equities", MessageBoxButtons.OK );
}
}
生成器模式的效果:
1. 生成器允许读者改变产品的内部表示,同时也隐藏了产品如何组装的细节。
2. 每个特定的生成器都独立于其他的生成器,同时独立于程序的其他部分,这一点提高了对象的模块性,并使添加其他的生成器变得相对简单。
3. 由于每个生成是根据数据一步一步构建最终结果,所以能精确地控制生成器构建的每个结果。
抽象工厂返回的是一系列相关的类,而生成器是根据提供给它的数据一步一步地构建一个复杂的对象。
- Builder生成器(创建型模式)
- Builder生成器(创建型模式)
- 【创建型模式】builder(生成器)
- 创建型模式-生成器(builder)
- Builder 生成器模式(创建型模式)
- Builder 生成器(创建型模式)
- 4.Builder 生成器(创建型模式)
- Builder(生成器)---对象创建型模式
- 三、Builder 生成器模式(创建型)
- 创建型模式:Builder(生成器)
- Builder 生成器(创建型模式) 笔记
- 设计模式-创建型-builder生成器
- 三、生成器模式Builder(创建型)
- 设计模式之生成器(Builder)----对象创建型模式
- 创建型模式——生成器模式(Builder Pattern)
- 设计模式-创建型模式之 Builder(生成器)
- 【设计模式基础】创建型模式 - 5 - 生成器(Builder)
- 【设计模式】创建型模式之生成器Builder
- 成为编程高手的八大奥秘
- Google发布Guice: Java IOC 框架. 挑战Spring!
- 开了新家!
- asp批量导入数据(sqlserver),数据源excel
- html相关知识
- Builder生成器(创建型模式)
- AT指令集及S寄存器
- VS2005调试嵌入式WINCE目标设备程序的连接方式
- 为RCP程序添加导航Navigator视图(转鹏)
- 驱动程序和AT命令
- one to many
- birt中设置BIRT_HOME
- 最有效防电脑辐射方法
- Wireless Hacks: 100 Industrial-Strength Tips & Tools