C# 工厂方法设计模式似乎只是一个If/Else或Switch语句。我错过了什么?
所以我一直在努力温习我的设计模式(感谢大学没有教授这些…),工厂方法设计模式给我带来了麻烦C# 工厂方法设计模式似乎只是一个If/Else或Switch语句。我错过了什么?,c#,design-patterns,factory-pattern,C#,Design Patterns,Factory Pattern,所以我一直在努力温习我的设计模式(感谢大学没有教授这些…),工厂方法设计模式给我带来了麻烦 为了避免问题区域中有大量的代码,我们将引用它。我没有个人代码,只是试图理解设计模式 据我所知,其中有几个部分: 产品-信用卡 具体产品-MoneyBackCreditCard、TitaniumCreditCard、, 铂镉 创造者-卡片工厂 ConcreteCreator-MoneyBackCardFactory、TitaniumCardFactory、, 铂镉工厂 但是,当我查看实现时,我看到的只是
为了避免问题区域中有大量的代码,我们将引用它。我没有个人代码,只是试图理解设计模式
据我所知,其中有几个部分:
感谢所有响应者。简而言之,接口用于创建对象,但子类决定实例化哪个类。对象的创建在需要时完成。工厂方法允许类稍后实例化为子类 原创 工厂模式并不神秘,事实上,它是最简单、最简单的设计模式之一 最简单的方法是,获取一组通过接口或基类相关的类,然后使用开关(或其他分支)决定创建哪个类,然后返回它
interface IMyLovelyHorse {...}
public class MyGreenHorse : IMyLovelyHorse {...}
public class MyYellowHorse : IMyLovelyHorse {...}
public class MyLittleHorse : IMyLovelyHorse {...}
...
public override IMyLovelyHorse CreateMyHorse(sometype somevalue)
{
switch(sometype)
{
case "MyGreenHorse" : return new MyGreenHorse();
...
}
}
引用的文章没有很好地解释工厂方法模式。在UML图中有
AnOperation
方法,但在代码中没有。实际上,该方法是工厂方法模式中最有趣的一点
这种模式的动机是,在一个类的某些操作
方法中,您希望以灵活的方式创建另一个类的新实例。首先,您只需使用new
关键字来实例化它。但是稍后,当您的程序运行时,您会发现它不够灵活,因为new
关键字后面提到的类必须始终是一个具体的类。因此,您将这个创建抽象为一个抽象方法,并让派生类实现它。这称为工厂方法模式。您甚至可以通过将这些抽象方法放入一个单独的类/接口中来实现更大的灵活性。这被称为抽象工厂模式,当然它更复杂
本文中的
if/else/switch/case
语句与工厂方法模式完全无关。该模式与用户选择哪个混凝土工厂无关,这是另一回事。通常,此选择发生在程序的结尾。main
方法就是这样一个地方。似乎没有令人满意的答案。所以让我试着解释一下,或者给你们提供一些链接
第一:是的,如果你缩小范围,这或多或少是一个基于条件的对象创建
为什么它如此特殊并被宣布为设计模式?
设计模式只不过是建议的“最佳”实践解决方案。工厂方法模式是为数不多的引入这种抽象的“创造性”模式之一,它涵盖了对象的“动态”类型和依赖性的主要情况,如抽象工厂模式。因此,特殊的是对象创建的抽象
要了解更多细节,请阅读以下内容:。在我看来,这是解释设计模式的最佳网站
可能任何基于条件的算法/代码封装对于任何“工厂模式”来说都是特殊的
- 因为这有助于防止使用 同样的条件
- 因此副作用/缺陷更少
- 虽然在我看来非常枯燥,但我仍然建议你们至少看下面youtube视频的前20分钟,以便真正理解 为什么如果是“坏”东西
避免使用if-else通常是您作为开发人员成熟的标志 这是一个没有开关的工厂的例子
public class CarFactory {
private readonly Dictionary<string, Car> cars;
public CarFactory() {
cars = new Dictionary<string, Car>();
}
public Car this[string carType] => cars[carType];
public string[] RegisteredTypes => cars.Keys.ToArray();
public Car CreateCar(string carType) => cars[carType];
public void RegisterCar(string carType, Func<Car> factoryAction) {
if (string.IsNullOrEmpty(carType)) return;
if (factoryAction is null) return;
cars[carType] = factoryAction();
}
}
公共级汽车制造厂{
私人只读字典车;
公共汽车制造厂(){
cars=新字典();
}
公共汽车本[string carType]=>cars[carType];
公共字符串[]RegisteredTypes=>cars.Keys.ToArray();
公共汽车CreateCar(字符串carType)=>cars[carType];
公共无效注册表CAR(字符串类型,Func factoryAction){
if(string.IsNullOrEmpty(carType))返回;
如果(factoryAction为空)返回;
cars[carType]=factoryAction();
}
}
然后,您将在应用程序启动时使用DI容器注册所有车辆类型
如果您不喜欢这样,那么也可以使用反射。这将带来性能惩罚。是否可以共享您编写的代码?通常工厂模式只有一个工厂,它将根据传递给工厂类的CreateIntance方法的参数返回正确的产品对象。是的,该方法将使用if-else块来检查参数的值并创建实例。这只是一个switch语句,因为没有实际的逻辑。其思想是,在一个中央计算机中获取一些用户输入并转换这些输入(比如数据库调用、网络请求等)point@ChatanCamilo我所理解的是,基于一些标准,一个对象的构造函数被决定并运行。又叫if/else,或者关闭我认为很抱歉的话题?所以它实际上只是一个方法,用来封闭一个条件检查?那么为什么它被算作一种设计模式呢?这似乎太简单了,无法定义
public class CarFactory {
private readonly Dictionary<string, Car> cars;
public CarFactory() {
cars = new Dictionary<string, Car>();
}
public Car this[string carType] => cars[carType];
public string[] RegisteredTypes => cars.Keys.ToArray();
public Car CreateCar(string carType) => cars[carType];
public void RegisterCar(string carType, Func<Car> factoryAction) {
if (string.IsNullOrEmpty(carType)) return;
if (factoryAction is null) return;
cars[carType] = factoryAction();
}
}