我有一堂这样的课
Pattern rexExp = Pattern.compile("_[a-zA-Z0-9]+_");
我有一种计算方法,可以创建此类的对象,用一些算术运算填充它,然后返回该对象。
public class OwnerWithholding
{
private decimal ManagementFeePct;
private decimal TotalManagementFee;
private decimal OperationalFeesPct;
private decimal TotalOperationalFees;
}
现在工作正常。 但是,这种计算方法只是填充数据的一种选择。
还有另一种计算方法,以完全不同的方式实现,但填充对象的属性完全相同。而且我可能会有更多。
我需要一种模式,该模式允许我创建相同类的对象,仅指示所需的计算方法。 我喜欢策略模式,其中算法将是填充调用它们的对象的方法。 但这看起来不太好。 也许工厂方法在这里更合适,但我不知道如何实现。
答案 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也值得一看。