什么模式可用于创建一个类的对象,但以不同的方式填充其属性?

时间:2019-10-10 13:59:50

标签: c# design-patterns strategy-pattern

我有一堂这样的课

Pattern rexExp = Pattern.compile("_[a-zA-Z0-9]+_");

我有一种计算方法,可以创建此类的对象,用一些算术运算填充它,然后返回该对象。

public class OwnerWithholding
    {

        private decimal ManagementFeePct;

        private decimal TotalManagementFee;

        private decimal OperationalFeesPct;

        private decimal TotalOperationalFees;

}

现在工作正常。 但是,这种计算方法只是填充数据的一种选择。

还有另一种计算方法,以完全不同的方式实现,但填充对象的属性完全相同。而且我可能会有更多。

我需要一种模式,该模式允许我创建相同类的对象,仅指示所需的计算方法。 我喜欢策略模式,其中算法将是填充调用它们的对象的方法。 但这看起来不太好。 也许工厂方法在这里更合适,但我不知道如何实现。

1 个答案:

答案 0 :(得分:1)

编辑:现在按照OP的注释,看来该类中的ONE方法需要以多种方式设置。 在这种情况下,模板模式(或生成器)更适合工厂,而不是工厂。

模板模式。

a。设置默认属性的抽象基类,但是省略了一个由具体类填充的属性(获取成分)。

    public abstract class PizzaCreator
    {
        public abstract string GetIngredients { get; }
        public string Bake { get; set; } = "Bake at 400F for 30 minutes";
        public string Deliver { get; set; } = "Deliver in custom box";
    }

b。两个披萨类,目前仅覆盖抽象属性

    public class CheesePizza : PizzaCreator
    {
        public override string GetIngredients
        {
            get { return GetMyIngredients(); }
        }

        string GetMyIngredients()
        {
            return "Lots of Cheese!";
        }
    }

    public class PepperoniPizza : PizzaCreator
    {
        public override string GetIngredients
        {
            get { return GetMyIngredients(); }
        }

        string GetMyIngredients()
        {
            return "Lots of Meats!";
        }
    }

我在这里创建比萨饼的实例

            var pepPizza = new PepperoniPizza();
            var chessePizza = new CheesePizza();

您甚至可以通过Factory类/方法来路由这些创建。

原始答案: 这是抽象工厂模式。

此代码进入Factory类库。

a.ICar接口

    public interface ICar
    {
        string Name { get; set; }
        int Doors { get; set; }
        string EngineCapacity { get; set; }
    }

b。抽象汽车厂

    public abstract class AbstractCarFactory
    {
        public abstract ICar CreateCar(CarType type);
    }

c。两辆混凝土车-

    internal class NissanPickUpTruck : ICar
    {
        public string Name { get; set; } 
        public int Doors { get; set ; }
        public string EngineCapacity { get ; set ; }
    }

    internal class NissanSportsCar: ICar
    {
        public string Name { get; set; } 
        public int Doors { get; set; }
        public string EngineCapacity { get; set; }
    }

d。混凝土工厂

    public class NissanFactory : AbstractCarFactory
    {
        public override ICar CreateCar(CarType type)
        {
            switch (type)
            {
                case CarType.PickupTruck:
                    return new NissanPickUpTruck{Name = "Titan", Doors = 6, EngineCapacity = "V12"};
                case CarType.SportsCar:
                    return new NissanSportsCar{Name = "350Z", Doors = 2, EngineCapacity = "V6"};
                default:
                    throw new Exception();
            }
        }
    }

最后来自外部项目的呼叫

            var nissanFactory = new NissanFactory();
            var sportsCar = nissanFactory.CreateCar(CarType.SportsCar);
            var pickUpTruck = nissanFactory.CreateCar(CarType.PickupTruck);

但是与其他评论一样,Builder也值得一看。

相关问题