抽象工厂模式
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
抽象工厂模式用来生产不同产品族的全部产品(对于新增加的产品无能为力,支持增加产品族)。
抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
抽象工厂模式demo
public interface Engine {
void run();
void start();
}
class LuxuryEngine implements Engine{
@Override
public void run() {
System.out.println("转的快");
}
@Override
public void start() {
System.out.println("启动快!可以自动启停!");
}
}
class LowEngine implements Engine{
@Override
public void run() {
System.out.println("转的慢");
}
@Override
public void start() {
System.out.println("启动慢!");
}
}
public interface Seat {
void massage();
}
class LuxurySeat implements Seat{
@Override
public void massage() {
System.out.println("可以自动按摩");
}
}
class LowSeat implements Seat{
@Override
public void massage() {
System.out.println("不能按摩");
}
}
public interface Tyre {
void revolve();
}
class LuxuryTyre implements Tyre{
@Override
public void revolve() {
System.out.println("旋转不磨损");
}
}
class LowTyre implements Tyre{
@Override
public void revolve() {
System.out.println("磨损快");
}
}
public interface CarFactory {
Engine createEngine();
Seat createSeat();
Tyre createTyre();
}
public class LowCarFactory implements CarFactory{
@Override
public Engine createEngine() {
return new LowEngine();
}
@Override
public Seat createSeat() {
return new LowSeat();
}
@Override
public Tyre createTyre() {
return new LowTyre();
}
}
public class LuxyryCarFactory implements CarFactory {
@Override
public Engine createEngine() {
return new LuxuryEngine();
}
@Override
public Seat createSeat() {
return new LuxurySeat();
}
@Override
public Tyre createTyre() {
return new LuxuryTyre();
}
}
public class Client {
public static void main(String[] args) {
System.out.println("====高级发动机的特性====");
CarFactory luxyryCarFactory = new LuxyryCarFactory();
Engine e = luxyryCarFactory.createEngine();
e.run();
e.start();
System.out.println("====低级轮胎的特性====");
CarFactory lowCarFactory = new LowCarFactory();
Tyre lowCarFactoryTyre = lowCarFactory.createTyre();
lowCarFactoryTyre.revolve();
}
}
运行结果如下:
可以看到,抽象工厂模式支持多个业务品种、业务分类。抽象工厂的每个方法都被声明成抽象,子类的方法覆盖这些方法来创建某些对象。所以说,抽象工厂的方法经常以工厂方法的方式实现。
类图
类图中将未使用到的Seat相关先隐藏了,不然生成的类图十分庞大。
工厂模式和抽象工厂模式的比较
简单工厂模式(静态工厂模式):虽然某种程度不符合设计原则,但是实际使用最多。(虽然简单工厂模式不是一种设计模式,但是它在实际应用中使用的场景还是很多的)。
工厂方法模式:不修改已有类的前提下,通过增加新的工厂类实现扩展。
抽象工厂模式:不可增加产品,可以增加产品族。(产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。)
工厂方法与抽象工厂都是负责创建对象,工厂方法用的是继承,而抽象工厂用的是对对象的组合。
利用工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法。这个工厂方法是用来创建对象的。整个工厂方法模式就是通过子类来创建对象。用这种做法,客户只需要他们所使用的抽象类型就可以了,由子类来负责决定具体类型,换句话说,工厂方法负责将客户从具体类型中解耦。
抽象工厂使用具体工厂用来创建产品(这里使用了工厂方法模式)。而工厂方法中,抽象创建者中所实现的代码通常会用到子类所创建的具体类型。
应用场景
JDK中Calendar的getInstance()
JDBC中Connection对象的获取
Hibernate中SessionFactory创建session
spring中IOC容器创建管理bean对象
XML解析时的DocumentBuilderFactory创建解析器对象
反射Class对象的newInstance()
以上为抽象工厂模式的学习笔记,此文章为尚学堂视频的学习笔记+自己总结。参考资料:Head First 设计模式。