我知道有很多关于不同工厂模式的不同的问题,但是答案是如此的不同和令人困惑。我读过的书使用了不清楚的和(超过)简化的例子。即使在我阅读过维基百科的解释之后,我也有很多问题,还有很多关于它们的在线解释,包括在这些网站上的所有解释。我目前正在读的书是“头第一设计模式”。
在Simple Factory中,客户端使用单独的类(Creator)和工厂方法(可以是静态的)返回产品。
在Factory方法模式中,Creator和Client是相同的东西,它们在同一个类中使用抽象方法来创建新产品,并在这个类中操作。当然,Creator (或客户端)是抽象的,所以关于具体产品的决策被推迟到子类。
(P.S.请不要把这个标记为副本,我想在这个网站上把这件事弄清楚)
发布于 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的情况下创建依赖对象的一种方法。
我不能回答你的第三个问题,因为我认为这是基于喜好。
发布于 2013-12-31 15:30:34
Simple Factory --这不是一个官方的GoF模式,事实上,在我拿出“第一设计模式手册”之前,我不知道你在说什么。Simple只是一种可以返回不同硬编码子类型的方法。
public Pizza createPizza(String type){
if(type.equals("cheese")){
return new CheesePizza();
}else if (type.equals("pepperoni")){
return new PepperoniPizza();
}
...
}这段代码的问题是,您只能使用硬编码类型。如果要更改方法的工作方式或返回的类型,则必须修改代码并重新编译。添加新类型将非常困难。
Factory方法--在超类中完成大部分工作,但将使用哪种对象的决定推迟到运行时。通常,超类需要创建某种默认类型的worker对象,但是超类允许子类专门化该工作人员。工厂方法通常在AbstractFactory过度使用时使用,但缺点之一是它迫使您使用继承,而继承有它自己的一组维护和设计问题。这与SimpleFactory非常相似,只是使用继承而不是鉴别器来获得不同的返回类型。
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对象的抽象工厂。LinkedList或HashSet等类都有自己的iterator()实现(因此是具体工厂),它们返回实现迭代器接口(具体产品)的不同类。
一旦您完成了,我建议您在模式上使用Holub,代码有点过时(预泛型),但是您确实了解了在非平凡的代码示例中,多个模式是如何相互作用的。这本书只有两个代码样本,每个样本涵盖大约10个模式,并采取100+页面,每一步解释。
发布于 2017-05-22 05:50:47
简单工厂:
定义:
创建对象,而不向客户端公开实例化逻辑。通过公共接口引用新创建的对象。
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();
}
}工厂方法:
定义:
定义用于创建对象的接口,但让子类来决定实例化哪个类通过公共接口引用新创建的对象。
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();
}
}https://stackoverflow.com/questions/20848082
复制相似问题