源码地址 | https://github.com/DingMouRen/DesignPattern |
---|
- AbstractFactory声明了一组用于创建一种产品的方法,每一个方法对应一种产品。
- ConcreteFactory实现在抽象工厂中定义的创建产品的方法,生成一组具体产品,同样的产品有不同的类型。
- AbstractProduct为每一种产品声明接口
- ConcreteProduct定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的方法。
定义
抽象工厂模式定义一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类。
使用场景
这里举个栗子说明,假设自行车由车身和轮子组成,这里有一般的自行车和山地车,虽然都是自行车,但是车身和轮子都是自己特有的,工厂一般都是单一职能的,生产车身就只能生产车身,但是可以生产不同类型的车身。所以现在的状况就是:有两个工厂,分别来生产车身和轮子,然后组成相应的自行车。
协作
- 一般在运行时创建一个ConcreteFactory类的实例。这个具体工厂创建特定实现的产品对象。为创建不同的产品对象,客户端应该使用不同的具体工厂。
- AbstracFactory将产品对象的创建延迟到它的ConcreteFactory子类
举个栗子
我们要生产两种自行车:一般自行车和山地车。这两种自行车的部件都是自身特有,这里假设是轮胎和车把。一个工厂专门生产轮胎,可以生产各种轮胎哦,一个工厂专门生产把手,也是可以生产各种车把。然后将相应的部件组装成一般自行车和山地自行车。
//抽象工厂类
public abstract class BikeFactory {
//生产轮胎
public abstract Tyre createTyre();
//生产车把
public abstract HandleBar createHandleBar();
}
//具体工厂类:一般的自行车
public class GeneralBikeFactory extends BikeFactory{
@Override
public Tyre createTyre() {
return new GeneralBikeTyre();
}
@Override
public HandleBar createHandleBar() {
return new GeneralBikeHandleBar();
}
}
//具体工厂类:山地车
public class MountainBikeFactory extends BikeFactory {
@Override
public Tyre createTyre() {
return new MountainBikeTyre();
}
@Override
public HandleBar createHandleBar() {
return new MountainBikeHandleBar();
}
}
//抽象产品类:轮胎
public interface Tyre {
//展示轮胎的信息
String showInfo();
}
//具体产品类:一般自行车的车把
public class GeneralBikeTyre implements Tyre{
@Override
public String showInfo() {
return "轮胎类型:"+getClass().getSimpleName();
}
}
//具体产品类:山地车的轮胎
public class MountainBikeTyre implements Tyre {
@Override
public String showInfo() {
return "轮胎类型:"+getClass().getSimpleName();
}
}
使用
public static void main(String[] args) {
//创建工厂
BikeFactory generalBikeFactory = new GeneralBikeFactory();
BikeFactory mountainBikeFactory = new MountainBikeFactory();
//生产一般自行车的部件用来组装
System.out.println(generalBikeFactory.createHandleBar().showInfo());
System.out.println(generalBikeFactory.createTyre().showInfo());
System.out.println("一般自行车组装完成");
System.out.println("--------");
System.out.println(mountainBikeFactory.createHandleBar().showInfo());
System.out.println(mountainBikeFactory.createTyre().showInfo());
System.out.println("山地自行车组装完成");
}
总结
优点:分离接口与实现,客户端使用抽象工厂来创建需要的对象,客户端不知道是谁具体实现的,客户端所做的就是面向产品的接口编程,从具体的产品中实现了解耦;同时因为接口和实现的分离,使得在切换产品类时更加灵活
缺点:1.类文件的爆炸性增加 2.不太容易扩展产品类。每当增加一个产品类,就要修改抽象工厂,那么随之所有的具体工厂类都会被修改。