工厂模式分类
简单工厂模式(simple factory):类的创建模式,又叫静态工厂方法(static factory method)模式。
简单工厂模式就是由一个工厂类根据传入的参数决定创建哪一种的产品类。工厂方法模式(Factory Method):一抽象产品类派生出多个具体产品类;一抽象工厂类派生出多个具体工厂类;每个具体工厂类只能创建一个具体产品类的实例。即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)。工厂与产品是“一对一”的关系。
抽象工厂模式(Abstract Factory):多个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;每个具体工厂类可创建多个具体产品类的实例。即提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体的类。工厂与产品是“一对多”的关系。
简单优缺点分析
简单工厂方法
优点:调用的客户端不需要修改代码。
缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。
缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。
工厂方法模式
好处:增加一个产品类,只需要增加产品类和相对应的工厂,两个类,不需要修改工厂类。缺点:增加产品,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。
抽象工厂模式:
优点:易于交换产品系列缺点:例如增加一个产品,需要修改所有创建产品的工厂,使用新的工厂还是要修改客户端代码的。
应用场景
工厂方法:
在以下情况下,适用于工厂方法模式:(1) 当一个类不知道它所必须创建的对象的类的时候。
(2) 当一个类希望由它的子类来指定它所创建的对象的时候。
(3) 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
抽象工厂:
(1) 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。(2) 这个系统有多于一个的产品族,而系统只消费其中某一产品族。
(3) 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
(4) 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
UML图
抽象工厂模式
简单工厂模式
工厂方法模式
代码实现
这里只写工厂方法模式,详细代码可以参照github
package com.designpattern.factory;
public interface ProductA {
public void describe();
}
package com.designpattern.factory;
public class ProductA1 implements ProductA {
@Override
public void describe() {
System.out.println("this is ProductA1");
}
}
package com.designpattern.factory;
public class ProductA2 implements ProductA {
@Override
public void describe() {
System.out.println("this is ProductA2");
}
}
package com.designpattern.factory.factorymethod;
import com.designpattern.factory.ProductA;
public interface ProductACreator {
public ProductA createProduct();
}
package com.designpattern.factory.factorymethod;
import com.designpattern.factory.ProductA;
import com.designpattern.factory.ProductA1;
public class ProductA1Creator implements ProductACreator {
@Override
public ProductA createProduct() {
return new ProductA1();
}
}
package com.designpattern.factory.factorymethod;
import com.designpattern.factory.ProductA;
import com.designpattern.factory.ProductA2;
public class ProductA2Creator implements ProductACreator {
@Override
public ProductA createProduct() {
return new ProductA2();
}
}
网上流传的这个模式在jdk中的应用
java.util.Calendar#getInstance()
java.util.Arrays#asList()
java.util.ResourceBundle#getBundle()
java.net.URL#openConnection()
java.text.NumberFormat#getInstance()
java.lang.management.ManagementFactory (all getXXX() methods)
java.nio.charset.Charset#forName()
javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.transform.TransformerFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()
线程池中,ThreadFactory 做为抽象工厂,Runnable 作为抽象产品。
相关代码github地址:https://github.com/robertjc/simpledesignpattern
不断完善中,有问题请多指教
欢迎扫描二维码,关注公众号