对象说除了单例模式以外这个设计模式最简单……小100行……哪里简单

学习建造者模式再次印证了学习OOP最好的方法是学设计模式

运用场景是讲一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。即:讲一个产品的内部表象和产品的生成过程分割开来,从而可以使得一个建造过程生成具有不同内部表象的产品对象。如果使用建造者模式,那么用户就可以只需指定需要建造的类型就可以得到他们,具体的建造过程和细节不需要知道

具体几个类:

Product 具体产品

Builder为创建一个Product对象的各个部分指定的抽象接口

ConcreteBuilder是具体的建造者,实现Builder接口,构建和装配各个部件

Director 构建一个使用builder接口的对象

主要用在创建一些复杂的对象,这些对象内部构建之间的建造顺序是稳定的,但是对象内部的构建通常面临着复杂的变化

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

举个例子

Product产品类

class Student
    {
        IList<string> parts = new List<string>();
        public void Add(string part)
        {
            parts.Add(part);//添加属性
        }
        public void Show()
        {
            Console.WriteLine("学生  创建---");
            foreach(string part in parts)
            {
                Console.WriteLine(part);
            }
        }
    }

Builder类 抽象建造者类,确定产品由两个部件 Score Personilty组成(好像拼错了)

并声明一个得到结果的方法GetStudent

abstract class Builder
    {
        public abstract void BuildPartScore();
        public abstract void BuildPartPersonilty();
        public abstract Student GetStudent();
    }

ConcreteBuilder  具体建造类

class ConcreteBuilder1:Builder
    {
        private Student student = new Student();
        public override void BuildPartScore()
        {
            student.Add("Score A");
        }
        public override void BuildPartPersonilty()
        {
            student.Add("Open");
        }
        public override Student GetStudent()
        {
            return student;
        }
    }
    class ConcreteBuilder2:Builder
    {
        private Student student = new Student();
        public override void BuildPartScore()
        {
            student.Add("Score F");
        }
        public override void BuildPartPersonilty()
        {
            student.Add("Closed");
        }
        public override Student GetStudent()
        {
            return student;
        }
    }

Director指挥类 学校

class School
    {
        public void Construct(Builder builder)
        {
            builder.BuildPartScore();
            builder.BuildPartPersonilty();
        }
    }

客户端

static void Main(string[] args)
        {
            School school = new School();
            Builder b1 = new ConcreteBuilder1();
            Builder b2 = new ConcreteBuilder2();
            school.Construct(b1);
            Student s1 = b1.GetStudent();
            s1.Show();
            school.Construct(b2);
            Student s2 = b2.GetStudent();
            s2.Show();
            Console.Read();
        }

结果:

学生  创建---
Score A
Open
学生  创建---
Score F
Closed