首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单工厂的动机与工厂方法模式

简单工厂的动机与工厂方法模式
EN

Stack Overflow用户
提问于 2013-12-30 21:45:49
回答 6查看 6.2K关注 0票数 10

我知道有很多关于不同工厂模式的不同的问题,但是答案是如此的不同和令人困惑。我读过的书使用了不清楚的和(超过)简化的例子。即使在我阅读过维基百科的解释之后,我也有很多问题,还有很多关于它们的在线解释,包括在这些网站上的所有解释。我目前正在读的书是“头第一设计模式”。

在Simple Factory中,客户端使用单独的类(Creator)和工厂方法(可以是静态的)返回产品。

在Factory方法模式中,Creator和Client是相同的东西,它们在同一个类中使用抽象方法来创建新产品,并在这个类中操作。当然,Creator (或客户端)是抽象的,所以关于具体产品的决策被推迟到子类。

  1. 我的理解是正确的吗(对前。FMP中的客户端和Creator是相同的吗,我从未在FMP图中看到过客户端)?
  2. 在Factory方法模式中,创建方法在Creator之外是不可重用的,因此它只能在创建新的Creator时才能重用?
  3. ,在什么情况下,我可以选择一个而另一个呢?

(P.S.请不要把这个标记为副本,我想在这个网站上把这件事弄清楚)

EN

回答 6

Stack Overflow用户

发布于 2015-01-29 13:55:22

Simple Factory是一个工厂,其形式是。因此,它不能优雅地解决问题,因为对于Product的每一个新子类,您都必须在create()方法中编辑switch语句。这违反了开放/关闭原则。使简单工厂有用的一种可能方法是在这里使用类注册作为锯:http://www.oodesign.com/factory-pattern.html

工厂方法是一个工厂,其形式是方法(因此名)。这并不违反Open/Close原则,因为您通过扩展而不是修改代码来处理更改。

你的理解是正确的。FMP中的Client和Creator/Factory是相同的,因为Factory (方法)是客户机的一部分。

确实,FMP中的create方法是不可重用的。不过,这是可以的,因为这不是试图创建产品的应用程序范围的工厂,而是客户端在不使用new的情况下创建依赖对象的一种方法。

我不能回答你的第三个问题,因为我认为这是基于喜好。

票数 7
EN

Stack Overflow用户

发布于 2013-12-31 15:30:34

Simple Factory --这不是一个官方的GoF模式,事实上,在我拿出“第一设计模式手册”之前,我不知道你在说什么。Simple只是一种可以返回不同硬编码子类型的方法。

代码语言:javascript
复制
public Pizza createPizza(String type){
     if(type.equals("cheese")){
        return new CheesePizza();
     }else if (type.equals("pepperoni")){
        return new PepperoniPizza();
     }
     ...
}

这段代码的问题是,您只能使用硬编码类型。如果要更改方法的工作方式或返回的类型,则必须修改代码并重新编译。添加新类型将非常困难。

Factory方法--在超类中完成大部分工作,但将使用哪种对象的决定推迟到运行时。通常,超类需要创建某种默认类型的worker对象,但是超类允许子类专门化该工作人员。工厂方法通常在AbstractFactory过度使用时使用,但缺点之一是它迫使您使用继承,而继承有它自己的一组维护和设计问题。这与SimpleFactory非常相似,只是使用继承而不是鉴别器来获得不同的返回类型。

代码语言:javascript
复制
public void foo(){
   Bar bar = createBar();
   //do stuff with bar

}

//method is protected so subclass can override it to return something else
protected Bar createBar(){
   return new DefaultBar();
}

AbstractFactory -创建对象只知道它们实现的接口,而不是实际的类。AbstractFactories使代码很容易在不同的系统中工作,因为您不需要知道所使用的具体工厂或具体产品。

例如,Collection.iterator()Iterator对象的抽象工厂。LinkedListHashSet等类都有自己的iterator()实现(因此是具体工厂),它们返回实现迭代器接口(具体产品)的不同类。

一旦您完成了,我建议您在模式上使用Holub,代码有点过时(预泛型),但是您确实了解了在非平凡的代码示例中,多个模式是如何相互作用的。这本书只有两个代码样本,每个样本涵盖大约10个模式,并采取100+页面,每一步解释。

票数 4
EN

Stack Overflow用户

发布于 2017-05-22 05:50:47

简单工厂:

定义:

创建对象,而不向客户端公开实例化逻辑。通过公共接口引用新创建的对象。

代码语言:javascript
复制
public interface PaymentMethod {
    public void makePayment();
}

class CreditCard implements PaymentMethod {
    public void makePayment() {
        System.out.println("Payment through credit card...");
    }
}

class NetBanking implements PaymentMethod {
    public void makePayment() {
        System.out.println("Payment through net banking...");
    }
}

public class PaymentMethodFactory {
    public static PaymentMethod getPaymentMethod(String method) {
        if ("creditcard".equalsIgnoreCase(method)) {
            return new CreditCard();
        } else if ("netbanking".equalsIgnoreCase(method)) {
            return new NetBanking();
        } else {
            throw new IllegalArgumentException("Payment method not supported!");
        }
    }
}

public class SimpleFactoryTest {

    public static void main(String[] args) {
        PaymentMethodFactory factory = new PaymentMethodFactory();
        PaymentMethod paymentMethod = factory.getPaymentMethod("creditcard");
        paymentMethod.makePayment();
    }

}

工厂方法:

定义:

定义用于创建对象的接口,但让子类来决定实例化哪个类通过公共接口引用新创建的对象。

代码语言:javascript
复制
public interface PaymentMethod {
    public void makePayment();
}

class CreditCard implements PaymentMethod {
    public void makePayment() {
        System.out.println("Payment through credit card...");
    }
}

class NetBanking implements PaymentMethod {
    public void makePayment() {
        System.out.println("Payment through net banking...");
    }
}
public interface IPaymentMethodFactory {
    public PaymentMethod getPaymentMethod();
}

class CreditCardFactory implements IPaymentMethodFactory {
    public PaymentMethod getPaymentMethod() {
        return new CreditCard();
    }
}

class NetBankingFactory implements IPaymentMethodFactory {
    public PaymentMethod getPaymentMethod() {
        return new NetBanking();
    }
}

public class FactoryMethodTest {

    public static void main(String[] args) {
        IPaymentMethodFactory factory = new CreditCardFactory();
        PaymentMethod paymentMethod = factory.getPaymentMethod();
        paymentMethod.makePayment();
    }

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20848082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档