抽象工厂模式是工厂方法模式的升级版,工厂方法中的每一个具体的工厂类负责生产一种对应的产品,而抽象工厂模式中的一个具体的工厂类负责的是生产一个产品线上的一个或多个产品。相对来说,抽象工厂模式不易扩展商品,但易扩展生产商品线的工厂类,也就是说商品线易扩展。
来看看工厂方法中产品的扩展:
//定义一个动物类
public interface Anim {
void eat();
}
//定义一个动物工厂类
public interface AnimFactory {
Anim create();
}
//增加一个动物:鸟
public class Bird implements Anim {
public void eat() {
//....
}
}
//创建鸟的具体工厂类
public BirdFactory implements AnimFactory {
public static Bird create() {
return new Bird();
}
}
我们可以看到,每个具体的工厂类只负责生产一个具体的商品,当新增商品时,只需要新增一个具体的工厂类即可,扩展性很高。
而对于抽象工厂方法:
//定义一个动物类
public interface Anim {
void eat();
}
//定义一个动物工厂类
public interface AnimFactory {
Anim createBird();
Anim createFish();
}
//增加一个动物:鸟
public class Bird implements Anim {
public void eat() {
//....
}
}
//增加一个动物:鱼
public class Fish implements Anim {
public void eat() {
//....
}
}
//创建具体工厂类:饲养场A
public FactoryA implements AnimFactory {
public static Bird createBird() {
return new Bird();
}
public static Fish createFish() {
return new Fish();
}
}
从中我们可以看到,一个产品线上的产品:鸟和鱼,被一个饲养场生产出来,而如果有第二个饲养场饲养这个产品线上的动物,只需要实现AnimFactory接口即可,所以扩展产品线非常简单,而一旦产品线上的产品需要增加时,就变成了“毒瘤代码”,AnimFactory需要新增创建新产品的方法,而其具体的实现类FactoryA、FactoryB...也需要做相应的修改,代价太大。
以上便是工厂方法模式和抽象工厂模式的最大区别。
二、 jdk中的抽象工厂模式jdk中连接数据库的代码是典型的抽象工厂模式,每一种数据库只需提供一个统一的接口:Driver(工厂类),并实现其中的方法即可。不管是jdbc还是odbc都能够通过扩展产品线来达到连接自身数据库的方法。
public interface Driver {
Connection connect(String url, java.util.Properties info)
throws SQLException;
boolean acceptsURL(String url) throws SQLException;
DriverPropertyInfo[] getPropertyInfo(String url, java.util.Properties info)
throws SQLException;
int getMajorVersion();
int getMinorVersion();
boolean jdbcCompliant();
public Logger getParentLogger()
throws SQLFeatureNotSupportedException;
}
具体可看源码。
本文由慕课网 ifynn原创,转载请注明!