在工厂方法中,工厂父类负责定义创建产品对象的公共接口,而工厂子类生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
uml:
注意到Product和Factory是平行的类层级。
下面看一个生产电视机的实例:
product接口:
public interface TV {
public void play();
}
子产品接口:
public class HaierTv implements TV{ @Override public void play() { System.out.println("海尔电视机播放中。。。"); } } public class HisenseTV implements TV{ @Override public void play() { System.out.println("海信电视机播放中。。。"); } }
工厂接口:
public interface TVFactory { public TV produceTV(); }
public class HaierTVFactory implements TVFactory{ @Override public TV produceTV() { return new HaierTv(); } } public class HisenseTVFactory implements TVFactory { @Override public TV produceTV() { return new HisenseTV(); } }
main方法:
public class Main { public static void main(String[] args) { TV tv; TVFactory factory; factory=new HaierTVFactory(); tv=factory.produceTV(); tv.play(); } }
工厂模式优点:
在工厂方法中,工厂方法用来创建客户所需要的产品,同时还向用户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关系所需产品的工厂,无需关心创建细节,甚至无需知道具体产品类的名字。
抽象工厂模式是工厂模式的泛化版,工厂模式是一种特殊的抽象工厂模式,在工厂方法模式中,每一个具体工厂只能生产一种具体产品,而在抽象工厂方法中,每一个具体工厂可以生产多个具体产品。
definition
Provide an interface for creating families of related or dependent objects without specifying their concrete classes. |
可以看到,工厂模式中的abstact product已有多个。每个产品是同一类型的产品。
Abstract factory有一个,继承的有多个。每个继承创建一个产品。
抽象工厂模式最早的应用是用来创建在不同操作系统的图形环境下都能运行的系统,比如在window与linux下都有图形环境的构建。
可以发现下面有2个产品等级结构,分别是button与text,同时有3个产品族。这个例子是解释抽象工厂模式最佳例子。
增加新的具体工厂和产品族很方便,无需修改现有系统,符合“ocp原则”。