Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 工厂方法设计模式似乎只是一个If/Else或Switch语句。我错过了什么?_C#_Design Patterns_Factory Pattern - Fatal编程技术网

C# 工厂方法设计模式似乎只是一个If/Else或Switch语句。我错过了什么?

C# 工厂方法设计模式似乎只是一个If/Else或Switch语句。我错过了什么?,c#,design-patterns,factory-pattern,C#,Design Patterns,Factory Pattern,所以我一直在努力温习我的设计模式(感谢大学没有教授这些…),工厂方法设计模式给我带来了麻烦 为了避免问题区域中有大量的代码,我们将引用它。我没有个人代码,只是试图理解设计模式 据我所知,其中有几个部分: 产品-信用卡 具体产品-MoneyBackCreditCard、TitaniumCreditCard、, 铂镉 创造者-卡片工厂 ConcreteCreator-MoneyBackCardFactory、TitaniumCardFactory、, 铂镉工厂 但是,当我查看实现时,我看到的只是

所以我一直在努力温习我的设计模式(感谢大学没有教授这些…),工厂方法设计模式给我带来了麻烦


为了避免问题区域中有大量的代码,我们将引用它。我没有个人代码,只是试图理解设计模式


据我所知,其中有几个部分:

  • 产品-信用卡
  • 具体产品-MoneyBackCreditCard、TitaniumCreditCard、, 铂镉
  • 创造者-卡片工厂
  • ConcreteCreator-MoneyBackCardFactory、TitaniumCardFactory、, 铂镉工厂
  • 但是,当我查看实现时,我看到的只是一组对象(具有共同的祖先),其构造函数是基于某个变量决定和调用的

    我想还有更正确的吗?据我所知,在if/else或switch语句中创建对象并没有定义设计模式。我不明白这有什么特别之处


    感谢所有响应者。

    简而言之,接口用于创建对象,但子类决定实例化哪个类。对象的创建在需要时完成。工厂方法允许类稍后实例化为子类

    原创

    工厂模式并不神秘,事实上,它是最简单、最简单的设计模式之一

    最简单的方法是,获取一组通过接口或基类相关的类,然后使用开关(或其他分支)决定创建哪个类,然后返回它

    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的情况下创建工厂。
    避免使用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();
      }
    }