细致的讲,工厂方法模式分为三种:简单工厂模式,工厂方法模式,抽象工厂模式
简单(静态)工厂模式
定义
由一个工厂类根据传入的参量决定创建出哪一种产品类的实例。
角色
创建者类(Creator)
1. 具体创建者类: 这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
产品类(Productor):
1. 抽象产品类: 它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
2. 具体产品类:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
工厂模式
定义
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
角色
创建者类(Creator)
- 抽象创建者类:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
- 具体创建者类:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
产品类(Productor):
- 抽象产品类:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
- 具体产品类:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
增加一个产品,只需加入这个产品类和它对应的工厂类,完全支持“开-闭”原则。而不必像简单工厂模式那样需要增加工厂方法的逻辑处理。
类图
实例
public abstract class Product {
String name;
String sauce;
void operate1() {
System.out.println(name);
}
void operate2() {
System.out.println(sauce);
}
}
public class Concrete1Product extends Product {
public Concrete1Product() {
name = "aa";
sauce = "aaaa";
}
void operate1() {
System.out.println(name + sauce);
}
}
public interface ICreator {
Product factoryMethod();
Product product(String type);
}
public class Concrete1Creator implements ICreator {
public Product product(String type){
// start step
return factoryMethod();
//next step
}
public Product factoryMethod(){
System.out.println("concrete factory method.");
return new Concrete1Product();
}
}
public class Client {
public static void main(String[] args){
ICreator creator = new Concrete1Creator();
Product product = creator.product("aa");
}
}
可以看出工厂方法的加入,使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。因为如果不能避免这种情 况,可以考虑使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实 现。
抽象工厂模式
定义
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
“抽象”来自“抽象产品角色”,而“抽象工厂”就是抽象产品角色的工厂。一个具体工厂负责一个产品层次,第n个具体工厂负责第n个产品层次,各个具体工厂都有一个共同的工厂接口。