现在的位置: 首页 > 综合 > 正文

java设计模式之建造者模式

2018年05月12日 ⁄ 综合 ⁄ 共 2986字 ⁄ 字号 评论关闭

在软件开发的过程中,当遇到一个“复杂的对象”,该对象由好多的部分组成,各个部分的组合比较稳定或有一定的依赖次序,但各部分自身却会经常面临着变化。如何隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”,这就是所谓的建造模式。
例子:
    买肯德基
:(Terrylee的例子)典型的儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。
        客户端:顾客。想去买一套套餐(这里面包括汉堡,可乐,薯条),可以有1号和2号两种套餐供顾客选择。
        指导者角色:收银员。知道顾客想要买什么样的套餐,并告诉餐馆员工去准备套餐。
       建造者角色:餐馆员工。按照收银员的要求去准备具体的套餐,分别放入汉堡,可乐,薯条等。
        产品角色:最后的套餐,所有的东西放在同一个盘子里面。
    计算工资:工资的计算一般是:底薪+奖金-税。但底薪分为一级8000、二级6000、三级4000三个等级。根据岗位不同奖金的发放也不一样,管理及日常事务处理岗位(A类)每月根据领导及同事间的评议得分计算奖金,销售岗位(B类)则根据销售额发放提成。税金则根据奖金和底薪的数额进行计算。由此看出该工资的计算方式是比较稳定的构建算法,但对工资的每一部分都会根据不同的情况产生不同的算法,如何将客户端与变化巨烈的底薪、奖金和税金计算方式分离呢,这也比较适合用建造者模式。

Builder模式的架构    
    

    抽象建造者(Builder):给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
    具体建造者(Concrete Builder):实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
    指导者(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
    产品(Product):要创建的复杂对象。

    程序实现:
    //指导者
    class Director
    {
        public void build(Builder b)
        {
           b.BuildPartA();
            b.BuildPartB();
        }
    }
    //抽象建造者
    abstract class Builder
    {
       //创建产品的第一部分
        public abstract void BuildPartA();
        //创建产品的第二部分
        public abstract void BuildPartB();
    }
    //具体建造者类
    class ConcreteBuilder1 : Builder
    {
        Product p = new Product();
        public override void BuildPartA()
        {
            p.Add("Part1","Part1");
        }
        public override void BuildPartB()
        {
            p.Add("Part2","Part2");
        }
       //返回产品对象
        public Product GetProduct()
        {
            return p;
        }
    }
    //具体建造者类
    class ConcreteBuilder2 : Builder
    {
       Product p = new Product();
        public override void BuildPartA()
        {
            p.Add("PartA","PartA");
        }
        public override void BuildPartB()
        {
            p.Add("PartB", "PartB");
        }
        //返回产品对象
        public Product GetProduct()
        {
            return p;
        }
    }
    //产品类
    class Product
    {
        StringDictionary sd = new StringDictionary();
        public void Add(string name, string value)
        {
            sd.Add(name, value);
        }
        public void Show()
        {
            foreach (DictionaryEntry de in sd)
            {
                Console.WriteLine(de.Key+"\t"+de.Value+"\n");
            }
        }
    }
    //客户程序
    class Client
    {
        public static void Main(string[] args)
        {
            Director d = new Director();
            Builder b1 = new ConcreteBuilder1();
            Builder b2 = new ConcreteBuilder2();
            d.build(b1);
            d.build(b2);
            ((ConcreteBuilder1)b1).GetProduct().Show();
            ((ConcreteBuilder2)b2).GetProduct().Show();
        }

    }

   每一个具体的建造者是相互独立的,完成某一类产品的组装生成,可以完成产品在组装过程中实现更精细的控制。
    在客户端程序中无需了解产品的构造,只需要实例化指导者对象和具体建造者对象,然后使用指导者对象来控制具体建造者的的建造过程和建造次序。
    在指导者对象中用来控制具体建造对象的建造过程。
    在具体建造者对象中用来实现产品每一部分的具体建造过程。
    在产品对象用来描述产品的各部件的组成。  

  建造者模式用来控制产品的建造过程,实现产品对象的组成变化与客户程序的分离,而工厂模式实现产品类型的变化与客户端程序的分离。

   一般来说在以下两种情况下应当考虑使用建造者模式:
       1、被建造的对象有复杂的组成部分,每一部分的生成算法又不一样。(采用具体建造者不同的方法,实现对象不同部分的构造)
       2、被建造的对象各部分有一定的组成顺序。(用Director对ConcreteBuild方法的调用次序来控制)

抱歉!评论已关闭.