Loading

设计模式之建造者模式

建造者模式定义

建造者模式是一种创建型设计模式(有的也称之为生成器模式), 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。

建造者模式结构

image-20210708224104166

  1. 建造者/生成器(Builder):清晰的定义通用步骤,确保它们可以制造所有形式的产品。 否则你将无法进一步实施该模式。
  2. 具体建造者(ConcreteBuilder):每个形式的产品创建具体生成器类, 并实现其构造步骤。
  3. 指挥者(Director):它可以使用同一生成器对象来封装多种构造产品的方式。

建造者模式实现

场景:盖房子,房子都有房顶、四面墙壁、窗户和门,可以使用不同的材料,例如,第一个建造者使用木头和玻璃,第二个建造者使用石头和钢铁。在调用一组步骤后,第一个建造者得到的是一栋普通房屋,第二栋得到的是一栋城堡

使用代码简单实现一下:

声明创建房屋通用步骤的接口

   public interface IHouseBuilder
    {
        void buildWall();
        void buildRoof();
        void buildWindow();
        void buildDoor();
        void buildResult();
    }

创建具体建造者,继承接口并实现

public class House : IHouseBuilder
    {
        public void buildDoor()
        {
            Console.WriteLine("装房门");
        }

        public void buildResult()
        {
            Console.WriteLine("普通木屋");
        }

        public void buildRoof()
        {
            Console.WriteLine("盖房顶");
        }

        public void buildWall()
        {
            Console.WriteLine("盖墙壁");
        }

        public void buildWindow()
        {
            Console.WriteLine("安装窗户");
        }
    }

创建指挥者,用于构建和组织步骤

public class HouseDirector
    {

        public void Construct(IHouseBuilder houseBuilder)
        {
            houseBuilder.buildWall();
            houseBuilder.buildWall();
            houseBuilder.buildWindow();
            houseBuilder.buildDoor();
        }
    }

客户端调用

static void Main(string[] args)
        {
            HouseDirector houseDirector = new HouseDirector();

            Console.WriteLine("------------------盖一栋普通木屋------------------");
            IHouseBuilder houseBuilder1 = new House();
            houseDirector.Construct(houseBuilder1);
            houseBuilder1.buildResult();

            Console.WriteLine("------------------盖一栋城堡------------------");
            IHouseBuilder houseBuilder2 = new Tower();
            houseDirector.Construct(houseBuilder2);
            houseBuilder2.buildResult();

            Console.WriteLine("Press Any Key to end!");
            Console.ReadKey();
        }

输出结果

image-20210708224620956

建造者模式优缺点

优点

  • 可以分步创建对象, 暂缓创建步骤或递归运行创建步骤。
  • 生成不同形式的产品时, 你可以复用相同的制造代码。
  • 单一职责原则。 你可以将复杂构造代码从产品的业务逻辑中分离出来。

缺点

  • 由于该模式需要新增多个类, 因此代码整体复杂程度会有所增加。

建造者模式使用场景

  • 当你希望使用代码创建不同形式的产品(例如石头或木头房屋)时,可使用生成器模式
  • 使用生成器构造组合树或其他复杂对象。

示例源代码

源代码仓库地址:https://github.com/luchong0813/DesignModel

posted @ 2021-07-08 22:49  傲慢与偏见luc  阅读(93)  评论(0编辑  收藏  举报