浅谈设计模式之建造者模式

建造者模式(Prototype):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。用户只需要指定需要创建的类型就可以得到产品,而不需要知道具体的构建过程。

建造者模式属于创建型的设计模式,生活中的很多例子都可以引用这种设计模式,比如我们去吃饭的时候点了一份套餐(产品),那么收银员(导演)就会通知厨师(建造者)按照这份套餐的各个部分组合做完之后让服务员端给用户。

UML图如下:
这里写图片描述

//需要建造的产品类
class Product 
{  
    //部件列表
    List<String> mPartList=new List<String>();  
    public void Add(String part)  
    {  
        mPartList.add(part);  
    }      
    public void Show()  
    {  
        foreach (string p in mPartList)  
            Print(p);  
    }  
}  

//抽象建造者
abstract class Builder 
{  
    public abstract void BuildPartA();  
    public abstract void BuildPartB();  
    public abstract Product GetProduct();        
} 
//具体建造者类
class ConcreteBuilder : Builder
{  
    Product mProduct=new Product();  

    public void BuildPartA() {   
        mProduct.Add("ConcreteBuilderA.buildPartA");  
    }  
    public void BuildPartB() {   
        mProduct.Add("ConcreteBuilderA.buildPartB");  
    }  
    public Product GetProduct() {  
        return mProduct;  
    }   
}  

//指挥者类
class Director
{
    //用来指挥建造过程
    public void Construct(Builder builder){
        builder.BuildPartA();
        builder.BuildPartB();
    }
}

//测试
static void Main((string[] args)
{
    //创建过程
    Builder builder = new ConcreteBuilder();
    Director director = Director();
    director.Construct(builder);
    //创建完成后的产品
    Product p = builder.GetResult();
    p.Show();
    Console.Read();
}

建造者模式主要适用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象的内部构建通常面对着复杂的变化。所以当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时,或者当构造过程必须允许被构造的对象有不同的表示时就应该考虑使用建造者模式了。

建造者模式的好处在于建造代码和表示代码分离了,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

从图中可以看到,建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。一般来说,如果产品的建造不复杂,那么请用工厂模式;如果产品的建造很复杂,那么请用建造者模式。

参考书籍:《大话设计模式》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值