一、什么是多态工厂模式
多态工厂模式 属于类的创建型模式,它又被称为 工厂方法模式 ( Factory Method Pattern ) 。 多态工厂模式 的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
二、模式中包含的角色及其职责
抽象工厂(Creator)角色: (比如 示例1中的FruitFactory.java) 工厂方法模式的核心,任何工厂类都必须实现这个接口。
具体工厂( Concrete Creator):角色 (比如 示例1 中的PearFactory.java) 具体工厂类是抽象工厂的一个实现,负责实例化产品对象。
抽象(Product)角色 :(比如 示例1 中的Fruit.java)工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色: (比如 示例1 中的Apple.java, Banana.java, Pear.java)工厂方法模式所创建的具体实例对象
三、 多态工厂模式
多态工厂模式 与 简单工厂模式 在结构上的不同不是很明显。 多态工厂模式 的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式 之所以有一个别名叫 多态性工厂模式 是因为具体工厂类都有共同的接口,或者有共同的抽象父类。 当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放-封闭”原则。而 简单工厂模式 在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模式退化后可以演变成简单工厂模式。
四、多态使用实例
在工厂方法模式里面,应该是 Creator 中的其它方法在使用工厂方法创建的对象,虽然也可以把工厂方法创建的对象直接提供给Creator外部使用,但工厂方法模式的本意,是由Creator对象内部的方法来使用工厂方法创建的对象,也就是说,工厂方法一般不提供给Creator外部使用。
客户端 应该是使用Creator对象,或者是使用由 Creator 创建出来的对象。对于客户端使用 Creator对象 ,这个时候工厂方法创建的对象,是Creator中的某些方法使用。对于使用那些由 Creator创建出来的对象 ,这个时候工厂方法创建的对象,是构成客户端需要的对象的一部分。
工厂方法一般不提供给Creator外部使用,但是有时我们的确需要这么做。下面将举例来说明。
示例1
Fruit.java文件
public
interface
Fruit
{
/*
* 采集
*/
public
void
get
();
}
Apple.java文件
public
class
Apple
implements
Fruit
{
/*
* 采集
*/
public
void
get
(){
System
.
out
.
println
(
"采集苹果"
);
}
}
Banana.java文件
public
interface
FruitFactory
{
public
Fruit
getFruit
();
}
Pear.java文件
public
class
Pear
implements
Fruit
{
public
void
get
()
{
System
.
out
.
println
(
"采集梨子"
);
}
}
FruitFactory.java
public
interface
FruitFactory
{
public
Fruit
getFruit
();
}
AppleFactory.java文件
public
class
AppleFactory
implements
FruitFactory
{
public
Fruit
getFruit
()
{
return
new
Apple
();
}
}
BananaFactory.java文件
public
class
BananaFactory
implements
FruitFactory
{
public
Fruit
getFruit
()
{
return
new
Banana
();
}
PearFactory.java文件
public
class
PearFactory
implements
FruitFactory
{
public
Fruit
getFruit
()
{
return
new
Pear
();
}
}
MainClass.java文件
public
class
MainClass
{
public
static
void
main
(
String
[]
args
)
{
//获得AppleFactory
FruitFactory ff = new AppleFactory();
//通过AppleFactory来获得Apple实例对象
Fruit apple = ff.getFruit();
apple.get();
//获得BananaFactory
FruitFactory ff2 = new BananaFactory();
Fruit banana = ff2.getFruit();
banana.get();
//获得PearFactory
FruitFactory ff3 = new PearFactory();
Fruit pear = ff3.getFruit();