设计模式-建造者模式

抽象工厂模式:https://www.cnblogs.com/Kyle-Wang/p/16097677.html

一、建造者模式引入

  建造者模式和抽象工厂模式很类似。

  1、相同点:

    都是一个工厂内部并不只是创建一种对象,而是可以创建多种对象。

  2、不同点:

    抽象工厂创建的多种对象间是没有关联的,对象间不相互依赖,比如抽象工厂例子里的,主公、武将,他们可以单独创建出来。

    建造者创建的多种对象是有关联的,某个对象的创建,必须依赖其他对象的创建,具有顺序、组合关系。比如,创建一辆车,建造者模式里必须要可以创建引擎、车轮、轮毂、车架、车灯之类的,轮毂必须先创建出来,再组装车轮。

    正因为建造者更加的复杂,为了使调用方不用关心内部很复杂的对象创建、组装。引出了一个新角色:设计师(或者产品经理、导演)。调用方负责使用建造者来设计创建客户所需的对象,客户只需要向设计师拿就行了。

  3、总结:

    抽象工厂适用于创建复杂对象,而建造者模式适用于创建更复杂的对象。

二、建造者模式实现

  1、定义建造者抽象类

public abstract class AbstractBuilder
    {

        public abstract void Engine();

        public abstract void Wheels();

        public abstract void Light();

        public abstract Car Car();
    }

  2、定义不同建造者实现类

    比亚迪建造者类

public class BuilderBYD : AbstractBuilder
    {
        private Engine _Engine = null;
        private Wheels _Wheels = null;
        private Light _Light = null;

        public override void Engine()
        {
            this._Engine = new Engine()
            {
                Name = "_Engine"
            };

            Console.WriteLine("{0} build Engine", this.GetType().Name);
        }

        public override void Wheels()
        {
            this._Wheels = new Wheels()
            {
                Name = "_Wheels"
            };
            Console.WriteLine("{0} build Wheels", this.GetType().Name);
        }

        public override void Light()
        {
            this._Light = new Light()
            {
                Name = "_Light"
            };
            Console.WriteLine("{0} build Light", this.GetType().Name);
        }

        public override Car Car()
        {
            Console.WriteLine("组装 {0} {1} {2}", this._Engine, this._Light, this._Wheels);
            Console.WriteLine("{0} build 比亚迪*唐", this.GetType().Name);

            return new Car(this._Engine, this._Light, this._Wheels)
            {
                Name = "比亚迪*唐"
            };
        }
    }

    福特建造者类

public class BuilderFord : AbstractBuilder
    {
        private Engine _Engine = null;
        private Wheels _Wheels = null;
        private Light _Light = null;

        public override void Engine()
        {
            this._Engine = new Engine()
            {
                Name = "_Engine"
            };

            Console.WriteLine("{0} build Engine", this.GetType().Name);
        }

        public override void Wheels()
        {
            this._Wheels = new Wheels()
            {
                Name = "_Wheels"
            };
            Console.WriteLine("{0} build Wheels", this.GetType().Name);
        }

        public override void Light()
        {
            this._Light = new Light()
            {
                Name = "_Light"
            };
            Console.WriteLine("{0} build Light", this.GetType().Name);
        }

        public override Car Car()
        {
            Console.WriteLine("组装 {0} {1} {2}", this._Engine, this._Light, this._Wheels);
            Console.WriteLine("{0} build Mondeo", this.GetType().Name);

            return new Car(this._Engine, this._Light, this._Wheels)
            {
                Name = "Mondeo"
            };
        }
    }

  3、定义设计师类,

    

public class Director
    {
        private AbstractBuilder _AbstractBuilder = null;
        public Director(AbstractBuilder builder)
        {
            this._AbstractBuilder = builder;
        }

        public Car GetCar()
        {
            this._AbstractBuilder.Engine();
            this._AbstractBuilder.Wheels();
            this._AbstractBuilder.Light();

            return this._AbstractBuilder.Car();
        }
    }

  4、调用方式

                {
                    AbstractBuilder builder = new BuilderBYD();

                    Director director = new Director(builder);
                    director.GetCar();
                }


                {
                    AbstractBuilder builder = new BuilderFord();
                    Director director = new Director(builder);
                    director.GetCar();
                }    

 

    

posted @ 2022-04-05 14:33  暗,伏!  阅读(29)  评论(0编辑  收藏  举报