1、工厂方法模式
工厂方法模式是简单工厂模式的进一步优化与抽象,解决了简单工厂无法支持继承这一缺点,使用面向对象的多态这一特性, 在工厂方法模式中,核心的工厂类本身不再直接去创建某一个具体的产品,而是将由子类去创建某一类的产品,这种改变使 得在引进一个或一类新的产品时,不再去修改核心的工厂类,而是改变具体的某个工厂子类,或者新增一个工厂子类专门负责新引进的产品。
2、工厂方法的类图
3、工厂方法的java实现
核心工厂类(接口)IFactory
public interface IFacroty { public IProduct getProduct(); }
核发产品类(接口)IProduct
public interface IProduct { public void show(); }
两个具体的工厂子类FactoryA FactoryB
public class FactoryA implements IFacroty { public FactoryA() { } public IProduct getProduct() { return new ProductA(); } }
public class FactoryB implements IFacroty { public FactoryB() { } public IProduct getProduct() { return new ProductB(); } }
两个具体的产品子类ProductA ProductB
public class ProductA implements IProduct { public ProductA() { } public void show() { System.out.println("这是一个A产品"); } }
public class ProductB implements IProduct { public ProductB() { } public void show() { System.out.println("这是一个B产品"); } }
用于测试的客户类
最后运行程序输出:public class Client { public static void main(String[] args) { IFacroty facA,facB; IProduct pa,pb; facA = new FactoryA(); facB = new FactoryB(); pa = facA.getProduct(); pb = facB.getProduct(); pa.show(); pb.show(); } }
4、工厂方法与简单工厂的比较
和简单工厂相比,在结构上有明显不同,工厂方法模式的核心是一个抽象的类或接口,简单工厂的核心一个具体的万能工厂类,工厂方法的核心抽象工厂类将创建产品的工作交由一个子类,而这些子类每个相当于简单工厂核心类的某一功能,从而将创建产品的工作进一步的向下细化,将简单工厂模式推广为一个更加综合多功能的工厂方法模式。所以工厂方法模式又称作是多态的简单工厂模式。
工厂方法模式中,所有的产品类都继承自同一个抽象的核心产品类,而工厂类返回的也不是一个具体的产品,而是产品的父类,所以用户在使用创建出来的产品是不知道产品的具体类型,只需使用产品完成自己所需的工作就够了。这个基于继承与多态的设计,将整个创建的过程与细节封装起来,而不被用户知道。 在新增产品也不必再去修改核心的工厂类,而只是修改或增加其子类。
5、工厂方法在java体系中应用
在java中的Collection接口下,有许多的集合子类(List,Queue,Set),每个集合子类都会实现 Iterator接口,集合子类可以调用iteartor()方法获得一个迭代器,这种体系结构就是运用工厂 方法模式。iteartor()方法就是一个用于创建具体迭代器(产品)的方法。Iterator接口就是所有 产品的父类,而Collection接口就是一个核心工厂类,而List,Queue就是其子接口,ArrayList就是其中 一个具体的工厂类,当其调用iterator()方法获得一个具体的迭代器时,就是个一个封闭的创建产品的 过程。