抽象工厂模式
工厂方法模式存在一个工厂只能创建一个具体产品类的问题,所以需要一种工厂可以提供多种产品对象,这就是抽象工厂模式。
1、定义
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类
产品等级结构和产品族
首先要引入两个概念
- 产品等级结构:即产品的继承结构
- 产品族:在抽象工厂模式中,产品族是指由同一个工厂生成的位于不同产品等级结构中的一组产品
2、抽象工厂模式结构
- AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,一个方法对应一种产品
- ConcreteFactory(具体工厂):实现抽象工厂方法,生成一组具体产品,这些产品构成一个产品族
- AbstractProduct(抽象产品):产品声明接口,声明了产品所有具体的业务方法
- ConcreteProduct(具体产品):实现抽象产品方法,定义具体工程生产的具体产品对象
3、实例代码
AbstractFactory
定义抽象工厂类IAnimalFactory
public interface IAnimalFactory {
ICat createCat();
IDog createDog();
}
ConcreteFactory
创建抽象工厂类的两个实现类,WhiteAnimalFactory和BlackAnimalFactory
public class BlackAnimalFactory implements IAnimalFactory{
@Override
public ICat createCat() {
return new BlackCat();
}
@Override
public IDog createDog() {
return new BlackDog();
}
}
public class WhiteAnimalFactory implements IAnimalFactory{
@Override
public ICat createCat() {
return new WhiteCat();
}
@Override
public IDog createDog() {
return new WhiteDog();
}
}
AbstractProduct
定义抽象工厂中要生产的抽象产品接口ICat和IDog
public interface ICat {
void run();
}
public interface IDog {
void run();
}
ConcreteProduct
创建产品的实现类BlackCat、BlackDog、WhiteCat、WhiteDog
public class BlackCat implements ICat{
@Override
public void run() {
System.out.println("一只黑猫嗖嗖嗖嗖");
}
}
public class WhiteCat implements ICat {
@Override
public void run() {
System.out.println("一只白猫嗖嗖嗖嗖");
}
}
public class BlackDog implements IDog{
@Override
public void run() {
System.out.println("一只黑狗嗖嗖嗖嗖");
}
}
public class WhiteDog implements IDog{
@Override
public void run() {
System.out.println("一只白狗嗖嗖嗖嗖");
}
}
编写一个测试类Client
public class Client {
public static void main(String[] args) {
IAnimalFactory blackAnimalFactory = new BlackAnimalFactory();
ICat blackCat = blackAnimalFactory.createCat();
IDog blackDog = blackAnimalFactory.createDog();
blackDog.run();
blackCat.run();
IAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory();
ICat whiteCat = whiteAnimalFactory.createCat();
IDog whiteDog = whiteAnimalFactory.createDog();
whiteCat.run();
whiteDog.run();
}
}
一只黑狗嗖嗖嗖嗖
一只黑猫嗖嗖嗖嗖
一只白猫嗖嗖嗖嗖
一只白狗嗖嗖嗖嗖
4、抽象工厂模式优缺点
4.1优点
- 抽象工厂模式隔离了具体类的生成。所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例就可以在某种程度上改变整个系统的行为
- 一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象(将一个系列的产品统一一起创建)
- 增加新的产品族,无需改变已有系统,符合开闭原则
4.2缺点
- 增加新的产品等级结构会很麻烦,需对原有系统做较大的修改,甚至需要修改抽象层代码,违背开闭原则
5、抽象工厂模式适用环境
- 一系列相关产品对象(属于同一产品族)一起创建时需要大量的重复代码
- 产品等级结构稳定,设计完成后尽可能的不会向系统中增加或删除等级结构
- 当你提供一个产品类库,而只想显示它们的接口而不是实现时
- 一个系统要独立于它的产品的创建、组合和表示时。