1、概念介绍
工厂方法模式同样属于类的创建型模式,又被成为多态工厂模式。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂来不再负责产品的创建,这样核心类就成为一个抽象工厂的角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
2、角色与职责
在前面一篇文章中介绍的简单工厂模式,违反了封闭开放原则:(1)、抽象工厂角色
工厂方法模式的核心,任何工厂类都必须实现这个接口
(2)、具体工厂角色
具体工厂类是抽象工厂的一个实现,负责实例化产品对象
(3)、抽象角色
工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
(4)、具体产品角色
工厂方法模式所创建的具体实例对象。
3、比较
工厂方法模式与简单工厂模式在结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式之所以有一个别名叫做多态性工厂模式,是因为具体的工厂类都有同一个接口,或者说有同一个抽象的父类。
当系统扩展需要添加新的产品对象的时候,仅仅需要添加一个具体对象以及一个具体的工厂对象,原有的工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放--封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
工厂方法模式退化后可以演变成简单工厂模式。
4、代码展示
在简单工厂模式中,我们也实现了猫狗类,这次我们增加一个猪类。此处就不在取出猫狗类的代码,直接写出猪类的代码了,如下所示:
public class Pig implements Animal {
@Override
public void joke() {
// TODO Auto-generated method stub
System.out.println("嗷嗷嗷嗷");
}
}
在工厂方法模式中,我们使用工厂类调用得到一个实例对象,这里仅仅以本次的猪为例说明一下:
/**
* 猪的工厂类
*
* @author Administrator
*
*/
public class PigFactory implements AnimalFactory {
@Override
public Animal getAnimal() {
// TODO Auto-generated method stub
return new Pig();
}
}
这里我们一样在工厂类中找出一个方法,获得实例,这个实例可能是猪,可能是猫也可能是狗,最好的形式是返回他们的父类,然后强转就行了。在java中,这实际上是多态的一种体现形式:
/**
* 动物的工厂类---接口
*
* @author Administrator
*
*/
public interface AnimalFactory {
public Animal getAnimal();
}
5、测试
前面一篇文章中,我们主要讲了简单工厂模式的概念和方法,并没有直接调用,这里我们给出一个简单的测试类,仅仅以猪这个类为例说明,其它类可以自己填补上:
/**
* 测试类
*
* @author Administrator
*
*/
public class MainTest {
public static void main(String[] args) {
// 获得猪的工厂
PigFactory pf = new PigFactory();
// 产生一头猪
Pig pig = (Pig) pf.getAnimal();
pig.joke();
}
}