builder

动机

在软件系统中,有时候面临着一个复杂对象的创建工作,其通常是由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂的对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却相对稳定。

如何提供一种封装机制来隔离出复杂对象各个部分的变化,从而保持系统中稳定构建算法不随着需求的变化而变化

意图

将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建出不同的表示







     在建造者模式结构图中包含如下几个角色:

 Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。

ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。

Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。

 Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。

    class Product
    {
        public PartA A { get; set; }
        public PartB B { get; set; }
        public PartC C { get; set; }
    }
    class PartA
    { }


    class PartB
    { }


    class PartC
    { }
    abstract class Builder
    {
        protected Product prod = new Product();


        public abstract void BuildPartA();
        public abstract void BuildPartB();
        public abstract void BuildPartC();


        public Product GetResult()
        {
            return prod;
        }
    }


    class ConcreteBuilder : Builder
    {
        public override void BuildPartA()
        {
            prod.A = new PartA();
        }


        public override void BuildPartB()
        {
            prod.B = new PartB();
        }


        public override void BuildPartC()
        {
            prod.C = new PartC();
        }
    
    }


    class Director
    {
        private Builder builder;
        public Director(Builder builder)
        {
            this.builder = builder;
        }


        public void Construct()
        {
            builder.BuildPartA();
            builder.BuildPartB();
            builder.BuildPartC();
        
        }
    
    
    }


    class Program
    {
        public static void Main()
        {
            Builder builder = new ConcreteBuilder();
            Director director = new Director(builder);
            director.Construct();


            Product prod = builder.GetResult();
        
        }
    }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值