源码均以JDK1.8作为参考
1.定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
2.解析:
可能乍一看Factory设计模式的定义有点晕,但是细想想Factory的字面含义,其实也是很好理解的,所谓工厂,就是按照指定的需求生产出一些产品,Factory设计模式也不例外,是按照提供给Factory的需求说明,然后Factory按照需求生产出指定的产品,供调用的应用场景使用。
通用类图:
类图解析:
2.1.Product(抽象产品类)
定义产品的共同特性,对产品实现类进行通用约束。
2.2.ConcreteProduct(产品实现类)
产品的具体定义,可以有多个产品类的存在,均需实现Product抽象产品类。
2.3.Creator(抽象创建类)
即抽象工厂,定义了实现工厂的上层约束。
2.4.ConcreteCreator(实现工厂)
完成产品类的具体创建。
Factory设计模式的实现是集中处理某一些可以高度抽象类的实例化过程,当然这个实例化过程也包括实例内部数据的初始化,即使这样说是不是也对Factory还是不太理解呢,那么接下来现看看Factory通用类图的具体实现。
3.具体应用:
3.1.Product(抽象产品类)
public abstract class Product {
// .. 产品类的公共方法
public void method1(){
// .. 业务逻辑处理
}
// .. 抽象方法
public abstract void method2();
}
3.2.ConcreteProduct(产品实现类)
public class ConcreteProduct1 extends Product {
public void method2() {
// .. 业务逻辑处理
}
}
public class ConcreteProduct2 extends Product {
public void method2() {
// .. 业务逻辑处理
}
}
3.3.Creator(抽象创建类)
public abstract class Creator {
/*
* 创建一个产品对象,其输入参数类型可以自行设置
* 通常为String、Enum、Class等,当然也可以为空
*/
public abstract <T extends Product> T createProduct(Class<T> c);
}
3.4.ConcreteCreator(实现工厂)
public class ConcreteCreator extends Creator {
public <T extends Product> T createProduct(Class<T> c){
Product product=null;
try {
product = (Product)Class.forName(c.getName()).newInstance();
} catch (Exception e) {
// .. 异常处理
}
return (T)product;
}
}
这样是不是很一目了然呢,当需要ConcreteProduct1或者ConcreteProduct2中哪个类的实例时,只需要告诉ConcreteCreator要产生哪个类的实例就可以的,ConcreteCreator就可以按照具体的要求产生这个类的实例。工厂方法就是集中了同一类具有共同抽象的类的实例化过程,由此Factory进行具体的实例化。这样便于对类实例化进行管理,同时又屏蔽了具体类的实现细节。
注:本人是参照《设计模式之禅》和《设计模式》两本书学习所得,其中加入了自己对于Iterator设计模式的理解,以及对于JDK中源码的理解。下一篇将继续讲Factory的扩展模式。
版权声明:本文为博主原创文章,未经博主允许不得转载。