求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
要资料
 
 
 

设计模式教程
简单工厂模式
AbstractFactory模式
FactoryMethod模式
Prototype模式
Singleton模式
Template Method模式
Builder模式
Class-Adapter 模式
Facade 模式
Object-Adapter 模式
Bridge模式
 
 

Builder模式
 
1500 次浏览
39次  
 
来源:火龙果软件   作者:俎涛
 
问题 一个复杂产品有多个部件构成,这就需要产品的构造要足够灵活:可以更换部件, 构造的过程可以灵活编排,因为不同产品的构造过程可能不同。请给出一个可扩展的设计方案。
环境 一个产品有多个部件组成,每个部件可以独立构造,产品的构造过程和部件的构造可以分别处理。
解决方案 把产品的构造过程和各个部件的构造分离,构造过程可以灵活编排,部件的构造可以提供多种实现,可以为产品提供多个构造器,这样就可以根据由构造器替换不同的部件。

效果 实现了复杂对象的装配过程可调整,部件可替换。
实例 电脑的构造

结构类图

模式范例

下面对模式给出范例,包括:

  • 需求,采用用例模型描述
  • 设计,包括:设计类图,顺序图。
  • 实现:代码目录。
  • 运行:运行效果界面

用例模型

用例名称 买电脑
用例概述 用户给钱,制造商给出不同的电脑,进行电脑基本测试。
基本场景 1用户输入购买电脑的金额
1.1系统组装电脑,
1.2系统显示电脑的配置
系统测试电脑

业务规则 如果价格高于5000元,组装笔记本电脑,否则组装台式机。

模式应用说明

采用和模式方案同样的格式,具体化为当前的应用设计。

问题 一个电脑有多个部件(显示器、键盘、鼠标)构成,这就需要电脑的构造要足够灵活:可以更换部件, 构造的过程可以灵活编排,因为不同产品的构造过程可能不同。请给出一个可扩展的设计方案。
环境 一个电脑有多个部件(显示器、键盘、鼠标)组成,每个部件(显示器、键盘、鼠标)可以独立构造,产品的构造过程和部件的构造可以分别处理。
解决
方案
把电脑的构造过程和各个部件(显示器、键盘、鼠标)的构造分离,构造过程可以灵活编排,部件的构造可以提供多种实现,可以为产品提供多个构造器,这样就可以根据由构造器替换不同的部件。
效果 实现了电脑的装配过程可调整,部件(显示器、键盘、鼠标)可替换。

设计类图

顺序图:

代码目录

    // 如下的类是框架部分,

  

 

    //调度者,负责编排构造过程

    class Director

{

        //抽象的构造器,可以由不同的实现,用于替换部件

        public ComputerBuilder computerBuilder;

 

 

        //构造方法,根据价格调用不同的构造器:

        // price > 5000调用NoteBookBuilder,否则调用PCBuilder

        //并可以编排构造过程

        public void Construct(Product product,int price)

{

 

            if (price > 5000) //represents some local decision inside director

            {

                computerBuilder = new NoteBookBuilder();

 

            }

            else

            {

                computerBuilder = new PCBuilder();

 

            }

 

            computerBuilder._product = product;

 

            computerBuilder.BuildMonitor();

            computerBuilder.BuildKeypad();

            computerBuilder.BuildMouse();

 

 

 

 

        }

}

 

    //抽象的构造器,可以被不同的实现,进而替换部件

abstract class ComputerBuilder

{

        protected Product product;

        public Product _product

        {

            set { product = value; }

            get { return product; }

        }

 

        abstract public void BuildKeypad();

abstract public void BuildMonitor();

abstract public void BuildMouse();

}

 

    // 如下的类是应用部分

    //PCBuilde负责PC的构造

   

 

    class PCBuilder : ComputerBuilder

{

 

        //构建键盘

override public void BuildKeypad()

{

// Create some object here known to PCBuilder

Console.WriteLine("PCBuilder.BuildKeypad called");

            Keypad keypad = new Keypad();

 

            keypad.name = "Lenovo";

            keypad.color = "white";

 

            product.keypad = keypad;

}

 

        //构建CRT显示器

        override public void BuildMonitor()

        {

            // Create some object here known to PCBuilder

            Console.WriteLine("PCBuilder.Build ...CRT called");

            CRT crt = new CRT();

            crt.name = "冠捷";

            crt.color = "white";

 

            product.monitor = crt;

        }

 

        //构建鼠标

        override public void BuildMouse()

{

// Create some object here known to PCBuilder

Console.WriteLine("PCBuilder.BuildMouse called");

            Mouse mouse = new Mouse();

            mouse.name = "Lenevo";

            mouse.color = "white";

 

            product.mouse = mouse;

}

}

 

    // 如下的类是应用部分

    // 负责NoteBoo的构造

 

    class NoteBookBuilder : ComputerBuilder

    {

 

        //构造键盘

        override public void BuildKeypad()

        {

            // Create some object here known to PCBuilder

            Console.WriteLine("NoteBookBuilder.BuildKeypad called");

            Keypad keypad = new Keypad();

 

            keypad.name = "ThinkpadKeypad";

            keypad.color = "Black";

 

            product.keypad = keypad;

        }

 

        //构造LCD显示器

        override public void BuildMonitor()

        {

            // Create some object here known to PCBuilder

            Console.WriteLine("NoteBookBuilder.BuildLCD called");

            LCD lcd = new LCD();

            lcd.name = "Benq";

            lcd.color = "Black";

 

            product.monitor = lcd;

        }

 

 

        //构造鼠标

        override public void BuildMouse()

        {

            // Create some object here known to PCBuilder

            Console.WriteLine("NoteBookBuilder.BuildMouse called");

            Mouse mouse = new Mouse();

            mouse.name = "miniMouse";

            mouse.color = "black";

 

            product.mouse = mouse;

        }

    }

 

    //键盘部件

    class Keypad

    {

        public string name;

        public string color;

 

        public void Press()

        {

            Console.WriteLine("Key pad is pressed...");

        }

    }

 

    //抽象的显示器

  abstract  class Monitor

    {

        public string name;

        public string color;

 

        abstract public void Display();

    }

 

    //LCD显示器

    class LCD : Monitor

    {

 

        public override void Display()

        {

            Console.WriteLine("LCD is display...");

        }

    }

 

    //CRT显示器

    class CRT :Monitor

    {

        public override void Display()

        {

            Console.WriteLine("CRT is display...");

        }

    }

 

    //鼠标

    class Mouse

    {

        public string name;

        public string color;

 

        public void Move()

        {

            Console.WriteLine("Mouse is moving...");

        }

    }

 

    //产品,包括部件:keypadmonitormouse

    class Product

    {

        public string name;

        public Keypad keypad;

        public Monitor monitor;

        public Mouse mouse;

 

        //产品工作

        public void Work()

        {

            keypad.Press();

            monitor.Display();

            mouse.Move();

 

        }

 

    }

 

    /// <summary>

    ///   User 使用Director构造Product

    /// </summary>

    public class User

    {

        public static void Main(string[] args)

        {

            Product product = new Product();

            product.name = "涛的电脑";

 

 

            Console.WriteLine("请输入购买电脑的金额:");

           int price = Int16.Parse(Console.ReadLine());

 

            Director director = new Director();

 

director.Construct(product, price);

 

            Console.WriteLine("Keypad:{0}",product.keypad.name);

            Console.WriteLine("LCD:{0}", product.monitor.name);

            Console.WriteLine("Mouse:{0}", product.mouse.name);

 

            product.Work();

 

        }

    }

}

运行效果


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



1500 次浏览
39次
 捐助