抽象工厂模式
用来生产不同产品族的全部产品。(对于增加新的产品,无能为力; 支持增加产品族)
抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务 分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
示例代码:
高低端发动机:
package com.xyj.factory.abstractFactory;
/**
* 发动机接口
*/
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("启动慢!");
}
}
高低端座椅:
package com.xyj.factory.abstractFactory;
/**
* 座椅接口
*/
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("低端座椅不可按摩!");
}
}
高低端轮胎:
package com.xyj.factory.abstractFactory;
/**
* 轮胎接口
*/
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("高端轮胎旋转磨损大!");
}
}
抽象工厂模式接口:
package com.xyj.factory.abstractFactory;
/**
* Car工厂接口
*/
public interface CarFactory {
Engine createEngine();
Seat createSeat();
Tyre createTyre();
}
高端汽车工厂
package com.xyj.factory.abstractFactory;
/**
* 高端汽车工厂
*/
public class LuxuryCarFactory implements CarFactory{
@Override
public Engine createEngine() {
return new LuxuryEngine();
}
@Override
public Seat createSeat() {
return new LuxurySeat();
}
@Override
public Tyre createTyre() {
return new LuxuryTyre();
}
}
低端汽车工厂:
package com.xyj.factory.abstractFactory;
/**
* 低端汽车工厂
*/
public class LowFactory implements CarFactory{
@Override
public Engine createEngine() {
return new LowEngine();
}
@Override
public Seat createSeat() {
return new LowSeat();
}
@Override
public Tyre createTyre() {
return new LowTyre();
}
}
这样一来的话我们使用高端工厂自然只能创建高端发动机、座椅、轮胎;高端工厂自然只能创建低端发动机、座椅、轮胎。
测试:
package com.xyj.factory.abstractFactory;
//测试
public class Client {
public static void main(String[] args) {
CarFactory factory=new LuxuryCarFactory();
//高端汽车工厂创建高端发动机、座椅、轮胎
Engine e = factory.createEngine();
e.run();
e.start();
}
}
工厂模式总结
工厂模式要点:
简单工厂模式(静态工厂模式) 虽然某种程度不符合设计原则,但实际使用最多。
工厂方法模式 不修改已有类的前提下,通过增加新的工厂类实现扩展。
抽象工厂模式 不可以增加产品,可以增加产品族!
应用场景:
JDK中Calendar的getInstance方法
JDBC中Connection对象的获取
Hibernate中SessionFactory创建Session
spring中IOC容器创建管理bean对象
XML解析时的DocumentBuilderFactory创建解析器对象
反射中Class对象的newInstance()