【问题标题】:Please give an example of factory method pattern请举一个工厂方法模式的例子
【发布时间】:2015-06-24 04:17:48
【问题描述】:

我读到了factory 模式和factory method 模式之间的区别。

工厂方法模式将对象的实例化推迟到子类。它也是一个工厂方法,因为“Creator”的孩子负责实现“Create”方法。

作为一个简单的工厂,由想要创建对象的类直接调用。

但是对于工厂模式,我们也可以通过反射添加类注册并为要创建的对象使用一层子类并将对象实例化逻辑保留在这些子类中来解耦工厂类。

我没有得到符合上述工厂方法模式定义的工厂方法模式示例。

你能给我一个工厂方法的例子吗?

【问题讨论】:

    标签: design-patterns factory


    【解决方案1】:

    假设我们要生产水果:

        public interface Fruit {
            public void plant();
            public void grow();
        }
    
        // concrete fruit Apple
        public class Apple implements Fruit {
            @Override
            public void plant() {
                System.out.println("Apple is planted.");
            }
            @Override
            public void grow() {
                System.out.println("Apple is growing.");
            }
        }
    
        // concrete fruit Banana
        public class Banana implements Fruit {
            @Override
            public void plant() { ... }
            @Override
            public void grow() { ... }
        }
    

    工厂模式中,有一个工厂类负责生产新的实例。 虽然缺点是如果添加一种类型的实例,必须改变工厂类的逻辑

    例子:

    // Factory class
    public class FruitGarden {
        public static Fruit createFruit(String fruitName) throws Exception {
            if(fruitName.equals("Apple")) {
                return new Apple();
            } else if(fruitName.equals("Banana")) {
                return new Banana();
            } else {
                System.out.printf("Sorry! %s not supported.\n", fruitName);
                throw new Exception();
            }
        }
        /* another way to create instance
        public static Fruit createApple() {
            return new Apple();
        }
        public static Fruit createBanana() {
            return new Banana();
        }
        */
    }
    

    工厂方法模式中,有一个抽象工厂代表新实例的创建。不同类型的实例由不同的具体工厂创建。所有这些具体工厂都实现了抽象工厂接口或扩展了抽象工厂类。 如果添加一种新类型,只需添加一个具体工厂,这样它就具有更多的可扩展性

    例子:

    // abstract factory interface
    public interface FruitGarden {
        public Fruit createFruit();
    }
    
    // concrete factory which is responsible producing Apple
    public class AppleGarden implements FruitGarden {
        @Override
        public Fruit createFruit() {
            return new Apple();
        }
    }
    
    // concrete factory which is responsible producing Banana
    public class BananaGarden implements FruitGarden {
        @Override
        public Fruit createFruit() {
            return new Banana();
        }
    }
    

    【讨论】:

    • 感谢您的示例。我还有一个困惑。我已经看到,在工厂模式中,类的创建也可以与工厂类分开。例如看到这个链接jineshmathew.com/2013/04/…。那么在那种情况下,工厂方法和工厂模式之间并没有任何区别。
    • @MadhuriM 是的,使用反射也是一种避免硬编码对象类型的方法。而如果使用反射,您必须向工厂注册所需的产品类,例如Factory.create(Apple.class);,并且使用反射可能会使应用程序有点慢,因为反射不是高性能。动态加载外部库或插件时建议使用反射。
    【解决方案2】:

    Java 的Collection.iterator() 是一种工厂方法。

    集合的具体实现决定了这个方法返回的具体迭代器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多