当前位置: 首页 > 知识库问答 >
问题:

抽象工厂设计:将if else替换为enum

郁博学
2023-03-14

当我们使用抽象工厂模式时,我们通常有FactoryMaker类,它有一个GetFactory函数,我们在这个函数中传递参数,我们在传递参数的函数中有switchif-else逻辑,以决定返回哪个工厂。是创建传递的参数、枚举或对象,然后在这些对象中具有返回哪个工厂的逻辑会更好。例如:

让我们这样说吧,我们的工厂制造商是通过枚举国家代码来决定工厂的。


    public class FacoryMaker {

        public final static FacoryMaker fctry= new FacoryMaker();

        public static RetailFactory getFactory(CountryCode code){
            RetailFactory rt = null;
            if(code == CountryCode.UK){
                rt = new UKFactory();
            }
            if(code == CountryCode.US){
                rt = new USFactory();
            }
            return rt;
        }
    }

取而代之的是:


    public class FacoryMaker {

        public final static FacoryMaker fctry= new FacoryMaker();

        public static RetailFactory getFactory(CountryCode code){
            return code.getFactory();
        }
    }

和枚举将进行如下修改:


    public enum CountryCode {
        US(){
            @Override
            public RetailFactory getFactory() {
                return new USFactory();
            }
        },  
        UK(){
            @Override
            public RetailFactory getFactory() {
                return new UKFactory();
            }
        };  
        public abstract RetailFactory getFactory();
    }

但我不认为这是普遍遵循的。为什么会这样?为什么我们不能让传递的参数始终是一个对象,并且在对象内部有逻辑来获取哪个工厂的呢?它能在任何抽象的工厂设计下失败吗。在我看来很普通。此外,通过这一点,甚至可以删除工厂制造商,并直接使用对象来获取工厂实例。

共有1个答案

和和裕
2023-03-14

我认为抽象工厂是所有OOP语言的通用模式。当人们描述它时,他们应该展示一个通用的实现,它可以应用于所有这些语言。然后人们遵循模式,遵循一般的实现。

并且您的实现使用的是Enum,Java特别支持Enum,但其他OOP语言不支持Enum。

 类似资料:
  • 4. 抽象工厂(Abstract Factory) Intent 提供一个接口,用于创建 相关的对象家族 。 Class Diagram 抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。 抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory 中的 cr

  • 工厂-创建对象而不向客户机公开实例化逻辑,并通过公共接口引用新创建的对象。是工厂方法的简化版本 工厂方法-定义一个创建对象的接口,但让子类决定实例化哪个类,并通过公共接口引用新创建的对象。 抽象工厂-提供了创建相关对象家族的接口,而无需显式指定它们的类。 null

  • 我正在努力学习创造性设计模式,我想我现在理解了工厂方法模式。但在转向抽象工厂模式时,我找不到它的用途。我知道我错过了一些东西,但不知道在哪里。 在抽象工厂模式中,我们将有一个抽象工厂,混凝土工厂将返回实例。假设我们正在处理汽车的创建。我们将有一个像这样的抽象工厂 我们的混凝土工厂将是 在用户类中,我们将像 我认为我们也可以使用工厂模式构建相同的功能 在用户类中,我们可以 如果我的理解是正确的(如果

  • 本文向大家介绍C++设计模式之抽象工厂模式,包括了C++设计模式之抽象工厂模式的使用技巧和注意事项,需要的朋友参考一下 问题描述 之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理;由于工厂方法模式创建的对象都是继承于Product的,所以工厂方法模式中,每个工厂只能创建单一种类的产品,当需要生产一种全新的

  • 在抽象工厂模式中,涉及的主要实体是 抽象基地工厂 混凝土工厂每个延伸抽象基地工厂 客户端代码 基础产品 扩展基础产品的具体产品类别 我看过各种实现,并观察到客户机代码了解具体的工厂。根据我在不同地方看到的模式的共同定义,如下所示 定义一个用于创建对象的接口,但让子类来决定要实例化哪个类。 根据我的观察,是作为抽象工厂方法中的抽象方法实现的。它公开了一个非抽象的公共方法,比如,从中调用方法。根据具体

  • 本文向大家介绍Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】,包括了Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java设计模式之工厂模式。分享给大家供大家参考,具体如下: 一、 简单工厂 先来思考一个问题。我们平时写程序时,会有这种情况,A对象里面需要调用B对象的方法,这时我们使用的一般是new关键字来创建