65.9K
CodeProject 正在变化。 阅读更多。
Home

建造者模式

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2013 年 10 月 11 日

CPOL

4分钟阅读

viewsIcon

6620

建造者模式描述了一种将对象与其构造过程分离的方式。相同的构造方法可以创建对象的不同表示。

建造者模式描述了一种将对象与其构造过程分离的方式。
相同的构造方法可以创建对象的不同表示。
在以下情况中使用该模式
  • 您需要构造一个具有不同表示形式的复杂对象。
    表示形式。
  • 创建对象的算法应独立于
    对象的各个部分的组装方式。

有关该模式的 UML 图,请访问 dofactory 网站

C# 示例
让我们看一个建造者示例

    #region 指挥者

 

    /// <summary>

    /// 承包商负责

    /// 房屋的建造。

    /// </summary>

    class Contractor

    {

        #region 方法

 

        /// <summary>

        /// 使用给定的

        /// 房屋建造者

        /// </summary>

        /// <param name="house"></param>

        public void Construct(HouseBuilder houseBuilder)

        {

            houseBuilder.BuildFloor();

            houseBuilder.BuildWalls();

            houseBuilder.BuildDoors();

            houseBuilder.BuildWindows();

        }

 

        #endregion

    }

 

    #endregion

 

    #region 建造者

 

    abstract class HouseBuilder

    {

        #region 成员

 

        protected House _house;

 

        #endregion

 

        #region 属性

 

        public House House

        {

            get

            {

                return _house;

            }

        }

 

        #endregion

 

        #region 建造方法

 

        public abstract void BuildDoors();

        public abstract void BuildWindows();

        public abstract void BuildWalls();

        public abstract void BuildFloor();

 

        #endregion

    }

 

    #endregion

 

    #region 建造者产品

 

    class HousePart

    {

        #region 成员

 

        private string _strPartName;

 

        #endregion

 

        #region 属性

 

        /// <summary>

        /// 部件名称

        /// </summary>

        public string PartName

        {

            get

            {

                return _strPartName;

            }

        }

 

        #endregion

 

        #region 构造函数

 

        /// <summary>

        /// 使用给定的

        /// 名称构造一个新的房屋部件。

        /// </summary>

        /// <param name="name">给定的名称</param>

        public HousePart(string name)

        {

            _strPartName = name;

        }

 

        #endregion

    }

 

    class House

    {

        #region 成员

 

        private string _material;

        private List<HousePart> _houseParts;

 

        #endregion

 

        #region 属性

 

        /// <summary>

        /// 建筑材料

        /// </summary>

        public string Material

        {

            get

            {

                return _material;

            }

        }

 

        #endregion

 

        #region 构造函数

 

        /// <summary>

        /// 使用给定的

        /// 材料构造一个新的房屋。

        /// </summary>

        /// <param name="material">给定的材料</param>

        public House(string material)

        {

            _material = material;

            _houseParts = new List<HousePart>();

        }

 

        #endregion

 

        #region 方法

 

        /// <summary>

        /// 将房屋的一个部件添加到房屋中

        /// </summary>

        /// <param name="part">要添加的部件</param>

        public void AddPart(HousePart part)

        {

            _houseParts.Add(part);

        }

 

        #endregion

    }

 

    #endregion

 

    #region 具体建造者

 

    class GlassHouseBuilder : HouseBuilder

    {

        #region 方法

 

        public override void BuildFloor()

        {

            _house = new House("glass");

            House.AddPart(new HousePart("stone floor"));

        }

 

        public override void BuildWalls()

        {

            House.AddPart(new HousePart(House.Material +

                " walls"));

        }

 

        public override void BuildDoors()

        {

            House.AddPart(new HousePart("wood doors"));

        }

 

        public override void BuildWindows()

        {

            House.AddPart(new HousePart(House.Material +

                " windows"));

        }

 

        #endregion

    }

 

    class WoodHouseBuilder : HouseBuilder

    {

        #region 方法

 

        public override void BuildFloor()

        {

            _house = new House("wood");

            House.AddPart(new HousePart(House.Material +

                " floor"));

        }

 

        public override void BuildWalls()

        {

            House.AddPart(new HousePart(House.Material +

                " floor"));

        }

 

        public override void BuildDoors()

        {

            House.AddPart(new HousePart("iron doors"));

        }

 

        public override void BuildWindows()

        {

            House.AddPart(new HousePart("glass floor"));

        }

 

        #endregion

    }

 

    #endregion

这个例子很容易理解。有一个房屋承包商负责
按正确的顺序建造房屋。我们有一个建造者
抽象类,它为具体建造者定义了接口。
每个具体类都负责实现抽象方法,
因此以不同的方式构建部件。

摘要
总而言之,建造者模式并不常用。
它在某些方面与抽象工厂相似,但它们之间的区别是
建造者关注对象是如何被构建的,通过
不同的具体实现,而抽象工厂则关注的是什么产品
被构建。正如您在示例中看到的,有一个指挥者来组织
建造部件,从而使建造算法变得抽象。

© . All rights reserved.