不过这也不一定就不可以,假设我们上面Product和Factory接口包括它们的一套实现是现有的,并且我们无法改变,比如是一个第三方的jar包提供的。那么为了扩展这个第三方的jar包,我们可以将jar包中的工厂方法模式扩展成为抽象工厂来达到我们扩展现有类功能的目的,就像下面这样。
[java]
//抽象产品
interface Product{}
//具体产品
class ProductA implements Product{}
class ProductB implements Product{}
//工厂接口
interface Factory{
Product getProduct();
}
//具体的工厂A,创造产品A
class FactoryA implements Factory{
public Product getProduct() {
return new ProductA();
}
}
//具体的工厂B,创造产品B
class FactoryB implements Factory{
public Product getProduct() {
return new ProductB();
}
}
/* 假设以上是一个第三方jar包中的工厂方法模式,我们无法改动源码 */
//我们自己特有的产品
interface MyProduct{}
//我们自己特有的产品实现
class MyProductA implements MyProduct{}
class MyProductB implements MyProduct{}
//扩展原有的工厂接口
interface MyFactory extends Factory{
MyProduct getMyProduct();
}
//我们自己特有的工厂A,扩展自原有的工厂A,并且实现获得我们自己特有产品的接口方法
class MyFactoryA extends FactoryA implements MyFactory{
public MyProduct getMyProduct() {
return new MyProductA();
}
}
//同A
class MyFactoryB extends FactoryB implements MyFactory{
public MyProduct getMyProduct() {
return new MyProductB();
}
}
//抽象产品
interface Product{}
//具体产品
class ProductA implements Product{}
class ProductB implements Product{}
//工厂接口
interface Factory{
Product getProduct();
}
//具体的工厂A,创造产品A
class FactoryA implements Factory{
public Product getProduct() {
return new ProductA();
}
}
//具体的工厂B,创造产品B
class FactoryB implements Factory{
public Product getProduct() {
return new ProductB();
}
}
/* 假设以上是一个第三方jar包中的工厂方法模式,我们无法改动源码 */
//我们自己特有的产品
interface MyProduct{}
//我们自己特有的产品实现
class MyProductA implements MyProduct{}
class MyProductB implements MyProduct{}
//扩展原有的工厂接口
interface MyFactory extends Factory{
MyProduct getMyProduct();
}
//我们自己特有的工厂A,扩展自原有的工厂A,并且实现获得我们自己特有产品的接口方法
class MyFactoryA extends FactoryA implements MyFactory{
public MyProduct getMyProduct() {
return new MyProductA();
}
}
//同A
class MyFactoryB extends FactoryB implements MyFactory{
public MyProduct getMyProduct() {
return new MyProductB();
}
}
这样我们就可以得到我们自己特有的抽象工厂和使用我们自己特有的产品了,并且我们自己的抽象工厂还兼并了第三方jar包中的产品,例如,我们可以使用MyFactoryA获得jar包中的ProductA产品等。
上面的做法相当于我们从现有的体系当中,扩展出一套我们自己的继承体系,这样做的好处是我们可以完整的复用jar包中的各个类功能,缺点是继承会导致系统的复杂性增加,耦合度相对较高。
所以我们还可以有另外一种做法,就是创造我们自己的一套独有的工厂方法模式,这套体系与jar包中的类和接口毫无关系,我们再使用一个组合工厂将二者结合起来,就像下面这样。
[java]
//抽象产品
interface Product{}
//具体产品
class ProductA implements Product{}
class ProductB implements Product{}
//工厂接口
interface Factory{
Product getProduct();
}
//具体的工厂A,创造产品A
class FactoryA implements Factory{
public Product getProduct() {
return new ProductA();
}
}
//具体的工厂B,创造产品B
class FactoryB implements Factory{
public Product getProduct() {
return new ProductB();
}
}
/* 假设以上是一个第三方jar包中的工厂方法模式,我们无法改动源码 */
//我们自己特有的产品
interface MyProduct{}
//我们自己特有的产品实现
class MyProductA implements MyProduct{}
class MyProductB implements MyProduct{}
//我们自己的工厂接口
interface MyFactory{
MyProduct getMyProduct();
}
//我们自己特有的工厂A,产生产品A
class MyFactoryA implement