设计模式生成器模式BuilderCreational标签04标签05

C#04:(创建型模式)Builder 建造者模式.pdf

说明:

  • 建造者模式
  • 创建型模式

视频

点击查看【bilibili】

缘起

  • 假设创建游戏中的一个房屋House设施,该房屋的构建是由几个部分组成,且各个部分要富于变化。
  • 如果使用最直观的设计方法,每一个房屋部分的变化,都将导致房屋构建的重新修正……

    动机 —Motivation

    在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对**象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却是相对稳定的**。

    意图 —Intent

    将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 ———-《设计模式》GOF

    结构 —Structure

    image.png

    协作 —Collaborations

    image.png

    生活中的例子

    P04.建造者模式-Builder--Creational - 图3

    适用性

  1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  2. 当构造过程必须允许被构造的对象有不同的表示时。

    源代码实现

    Builder类

    1. public abstract class Builder
    2. {
    3. public abstract void BuildDoor();
    4. public abstract void BuildWall();
    5. public abstract void BuildWindows();
    6. public abstract void BuildFloor();
    7. public abstract void BuildHouseCeiling();
    8. public abstract House GetHouse();
    9. }

    Director类:这一部分是 组合到一起的算法(相对稳定)。

    1. public class Director
    2. {
    3. public void Construct(Builder builder)
    4. {
    5. builder.BuildWall();
    6. builder.BuildHouseCeiling();
    7. builder.BuildDoor();
    8. builder.BuildWindows();
    9. builder.BuildFloor();
    10. }
    11. }

    ChineseBuilder类

    1. public class ChineseBuilder:Builder
    2. {
    3. private House ChineseHouse = new House();
    4. public override void BuildDoor()
    5. {
    6. Console.WriteLine("this Door 's style of Chinese");
    7. }
    8. public override void BuildWall()
    9. {
    10. Console.WriteLine("this Wall 's style of Chinese");
    11. }
    12. public override void BuildWindows()
    13. {
    14. Console.WriteLine("this Windows 's style of Chinese");
    15. }
    16. public override void BuildFloor()
    17. {
    18. Console.WriteLine("this Floor 's style of Chinese");
    19. }
    20. public override void BuildHouseCeiling()
    21. {
    22. Console.WriteLine("this Ceiling 's style of Chinese");
    23. }
    24. public override House GetHouse()
    25. {
    26. return ChineseHouse;
    27. }
    28. }

    RomanBuilder类

    1. class RomanBuilder:Builder
    2. {
    3. private House RomanHouse = new House();
    4. public override void BuildDoor()
    5. {
    6. Console.WriteLine("this Door 's style of Roman");
    7. }
    8. public override void BuildWall()
    9. {
    10. Console.WriteLine("this Wall 's style of Roman");
    11. }
    12. public override void BuildWindows()
    13. {
    14. Console.WriteLine("this Windows 's style of Roman");
    15. }
    16. public override void BuildFloor()
    17. {
    18. Console.WriteLine("this Floor 's style of Roman");
    19. }
    20. public override void BuildHouseCeiling()
    21. {
    22. Console.WriteLine("this Ceiling 's style of Roman");
    23. }
    24. public override House GetHouse()
    25. {
    26. return RomanHouse;
    27. }
    28. }

    ChineseBuilder和RomanBuilder这两个是:这个复杂对象的两个部分经常面临着剧烈的变化。

    1. public class Client
    2. {
    3. public static void Main(string[] args)
    4. {
    5. Director director = new Director();
    6. Builder instance;
    7. Console.WriteLine("Please Enter House No:");
    8. string No = Console.ReadLine();
    9. string houseType = ConfigurationSettings.AppSettings["No" + No];
    10. instance = (Builder)Assembly.Load("House").CreateInstance("House." + houseType);
    11. director.Construct(instance);
    12. House house= instance.GetHouse();
    13. house.Show();
    14. Console.ReadLine();
    15. }
    16. }
    1. 1 <?xml version="1.0" encoding="utf-8" ?>
    2. 2 <configuration>
    3. 3 <appSettings>
    4. 4 <add key="No1" value="RomanBuilder"></add>
    5. 5 <add key="No2" value="ChineseBuilder"></add>
    6. 6 </appSettings>
    7. 7 </configuration>

    总结要点

  • Builder模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
  • 变化点在哪里,封装就在哪里—Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动。
  • Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。Builder模式通常和Composite模式组合使用。

  • 本文作者:GeekPower - Felix Sun
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!