【问题标题】:Builder design pattern in C#/C++ requires elevated access modifiers?C#/C++ 中的构建器设计模式需要提升的访问修饰符?
【发布时间】:2017-12-04 16:52:10
【问题描述】:

假设我们有一个 Vehicle 类,其中包含一个私有轮子集合,以及一个 AddWheel(Wheel i_WheelToAdd) 方法。在不使用构建器模式的情况下,我希望此方法受到保护,但因为我使用的是构建器设计模式,所以我别无选择,只能将其设置为内部(以允许构建器添加轮子)。

解决此问题的正确面向对象方法是什么?

(在 C#/C++ 中使用嵌套类对我没有帮助,假设在 Vehicle 内部我有一个嵌套类“VehicleBuilder”,这不会使其能够访问父级的私有/受保护成员就像在java中一样)

【问题讨论】:

    标签: c# design-patterns


    【解决方案1】:

    我要做的是让 Vehicle 类将构建器作为构造函数参数,并负责获取在构建器上创建的所有设置。我认为构建器构建所需的所有参数并获取适当的对象,它实际上不必直接处理设置属性。这样,您可以将 AddWheel 放在构建器上并保持 Vehicle 按钮关闭。

    public class Vehicle{
        public List<Wheel> Wheels {get; private set;}
        internal Vehicle(VehicleBuilder builder)
        {
             Wheels = builder.Wheels;
             //Set other useful properties...
        }
    }
    
    public class VehicleBuilder()
    {
        private List<Wheel> _wheels = new List<Wheel>;
        internal List<Wheel> Wheels
        {
          get{return _wheels;}
        }
        public void AddWheel(Wheel wheelToAdd)
        {
            _wheels.Add(wheelToAdd);
        }
       public Vehicle GetVehicle()
       {
          return new Vehicle(this);
       }
    }
    

    【讨论】:

      【解决方案2】:

      一种方法是将构建器作为一个从对象本身暴露出来的内部类:

      class Vehicle
      {
        ⁞
        class VehicleBuilder
        {
          ⁞
        }
        private Vehicle(...) { ... }
        public VehicleBuilder New => new VehicleBuilder();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-11
        • 2023-03-05
        • 2016-08-21
        • 1970-01-01
        • 2018-03-06
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多