1. 什么是抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式属于创建型模式,它将只生产单一类型产品但彼此之间相互依赖的工厂聚集起来,成为一个超级工厂;比如:一辆汽车由轮胎,发动机等组成,抽象工厂将只生产轮胎和发动机的工厂进行聚集,形成超级工厂
2. 抽象工厂模式的角色组成
- 抽象工厂角色:用于定义一个产品由哪些组件组成的接口规范
- 具体工厂角色:实现了抽象工厂接口,完成了产品组件的具体创建;它代表一个系列或版本的产品
- 抽象产品角色:用于定义产品规范的接口
- 具体产品角色:实现了抽象产品接口,它与具体工厂之间是多对一的关系;他代表一个系列或版本的组件
3. 代码示例
- 抽象工厂角色:用于定义一个产品由哪些组件组成的接口规范
package com.lt.patterns.factory;
import com.lt.patterns.product.IEngine;
import com.lt.patterns.product.IWheel;
/**
* 奔驰工厂规范:专门用于组装生产奔驰(假设此工厂只负责组装车轮和发动机)
* @author lt
* @date 2019年4月15日
* @version v1.0
*/
public interface IBenzFactory {
public IEngine getEngine();
public IWheel getWheel();
}
- 具体工厂角色:实现了抽象工厂接口,完成了产品组件的具体创建
package com.lt.patterns.factory.impl;
import com.lt.patterns.factory.IBenzFactory;
import com.lt.patterns.product.IEngine;
import com.lt.patterns.product.IWheel;
import com.lt.patterns.product.impl.Engine_01;
import com.lt.patterns.product.impl.Wheel_01;
/**
* 01型奔驰工厂-生产01型奔驰,性能一般
* @author lt
* @date 2019年4月15日
* @version v1.0
*/
public class Benz_01_Factory implements IBenzFactory {
@Override
public IEngine getEngine() {
return new Engine_01();
}
@Override
public IWheel getWheel() {
return new Wheel_01();
}
}
package com.lt.patterns.factory.impl;
import com.lt.patterns.factory.IBenzFactory;
import com.lt.patterns.product.IEngine;
import com.lt.patterns.product.IWheel;
import com.lt.patterns.product.impl.Engine_02;
import com.lt.patterns.product.impl.Wheel_02;
/**
* 01型奔驰工厂-生产02型奔驰,性能较好
* @author lt
* @date 2019年4月15日
* @version v1.0
*/
public class Benz_02_Factory implements IBenzFactory {
@Override
public IEngine getEngine() {
return new Engine_02();
}
@Override
public IWheel getWheel() {
return new Wheel_02();
}
}
- 抽象产品角色:用于定义产品规范的接口
package com.lt.patterns.product;
/**
* 抽象工厂模式-发动机规范
* @author lt
* @date 2019年4月15日
* @version v1.0
*/
public interface IEngine {
public void getEngine();
}
package com.lt.patterns.product;
/**
* 抽象工厂模式-车轮规范
* @author lt
* @date 2019年4月15日
* @version v1.0
*/
public interface IWheel {
public void getWheel();
}
- 具体产品角色:实现了抽象产品接口,它与具体工厂之间是多对一的关系
package com.lt.patterns.product.impl;
import com.lt.patterns.product.IEngine;
/**
* 发动机系列-01型发动机
* @author lt
* @date 2019年4月15日
* @version v1.0
*/
public class Engine_01 implements IEngine {
@Override
public void getEngine() {
System.out.println("01型发动机");
}
}
package com.lt.patterns.product.impl;
import com.lt.patterns.product.IEngine;
/**
* 发动机系列-02型发动机
* @author lt
* @date 2019年4月15日
* @version v1.0
*/
public class Engine_02 implements IEngine {
@Override
public void getEngine() {
System.out.println("02型发动机");
}
}
package com.lt.patterns.product.impl;
import com.lt.patterns.product.IWheel;
/**
* 轮胎系列-01型轮胎:性能一般
* @author lt
* @date 2019年4月15日
* @version v1.0
*/
public class Wheel_01 implements IWheel {
@Override
public void getWheel() {
System.out.println("01型轮胎");
}
}
package com.lt.patterns.product.impl;
import com.lt.patterns.product.IWheel;
/**
* 轮胎系列-02型轮胎:性能更加优秀
* @author lt
* @date 2019年4月15日
* @version v1.0
*/
public class Wheel_02 implements IWheel {
@Override
public void getWheel() {
System.out.println("02型轮胎");
}
}
4. 抽象工厂模式的特点
- 优点:
- 当新增一个系列的产品时,只需要新增一个具体工厂角色(UML图中绿色),满足“开闭原则”
- 缺点:
- 当同一个系列产品发生变化时,需要修改具体工厂
- 另外:
- 当产品的组件只有一个系列,或产品本身只有一个系列时,抽象工厂模式退化为工厂方法模式