java设计模式 抽象工厂模式
了解抽象工厂模式之前我们先来了解一个问题,一辆汽车有发动机,轮胎,空调等组成。他们都属于一辆车,如果使用工厂方法模式的话,我们就需要建立,发动机工厂,轮胎工厂,空调工厂等。这样产生了大量的工厂,但是如果使用抽象工厂模式就只需要建立一个汽车工厂就可以了。下面就以创建汽车的例子来讲解。
首先来了解两个概念:
产品等级结构:即产品的继承结构,比如一个抽象类是发动机,那么他的子类可能有:本田发动机,奔驰发动机等。有一个抽象类轮胎,那么他的子类可能有:本田轮胎,奔驰轮胎等。则抽象发动机与具体的品牌发动机(如:本田发动机)之间构成了一个产品等级结构。抽象轮胎类与具体的轮胎类(如:本田轮胎)之间构成了一个产品等级结构。
产品族:指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如”本田汽车工厂”生产本田汽车需要本田发动机、本田轮胎。本田发动机位于发动机产品等级结构中,本田轮胎位于轮胎产品等级中。本田发动机、本田轮胎构成了一个产品族。产品族和产品等级结构的关系如下图:
抽象工厂模式就是:用来创建一组相关或者相互依赖的对象(一个产品族里的对象)。比如:本田汽车使用本田发动机和本田轮胎,而奔驰汽车使用奔驰发动机和奔驰轮胎,那么使用抽象工厂模式,在为本田汽车生产相关配件时,就无需制定发动机和轮胎,它会自动根据车型生产配件。
抽象工厂模式主要涉及四种角色:
- 抽象工厂角色:是具体工厂必须实现的接口或抽象类,定义了创建不同产品族中涉及到的所有相关产品的创建。(汽车工厂生产汽车,需要涉及发动机,轮胎等)
- 具体工厂角色:实现或者继承至抽象工厂角色,是具体创建某一种产品族的工厂。(比如:奔驰工厂生产奔驰汽车,需要奔驰发动机,奔驰轮胎)
- 抽象产品角色:定义了产品,是具体产品需要实现的类(如:发动机,轮胎)
- 具体产品角色:继承至抽象产品角色,是具体产品的实现(如:本田发动机,奔驰发动机,本田轮胎,奔驰轮胎等)
抽象工厂模式的 UML图如下
第一步:创建抽象产品角色:
/**
* Created by IntelliJ IDEA.
* User:hubin
* Description:抽象发动机
* Date:2017/11/29
* Time:13:49
*/
public abstract class Engine {
public abstract void getEngineInfo();
}
/**
* Created by IntelliJ IDEA.
* User:hubin
* Description:抽象的轮胎
* Date:2017/11/29
* Time:13:54
*/
public abstract class Tyre {
public abstract void getTyreInfo();
}
第二步:创建具体的产品角色
/**
* Created by IntelliJ IDEA.
* User:hubin
* Description:奔驰发动机
* Date:2017/11/29
* Time:13:57
*/
public class BenzEngine extends Engine{
@Override
public void getEngineInfo() {
System.out.println("这是一个奔驰发动机");
}
}
/**
* Created by IntelliJ IDEA.
* User:hubin
* Description:本田发动机
* Date:2017/11/29
* Time:13:59
*/
public class HondaEngine extends Engine{
@Override
public void getEngineInfo() {
System.out.println("这是一个本田发动机");
}
}
/**
* Created by IntelliJ IDEA.
* User:hubin
* Description:奔驰轮胎
* Date:2017/11/29
* Time:13:58
*/
public class BenzTyre extends Tyre {
@Override
public void getTyreInfo() {
System.out.println("这是一个奔驰轮胎");
}
}
/**
* Created by IntelliJ IDEA.
* User:hubin
* Description:本田轮胎
* Date:2017/11/29
* Time:14:00
*/
public class HondaTyre extends Tyre {
@Override
public void getTyreInfo() {
System.out.println("这是一个本田轮胎");
}
}
第三部:创建抽象工厂角色
/**
* Created by IntelliJ IDEA.
* User:hubin
* Description:汽车抽象工厂
* Date:2017/11/29
* Time:14:03
*/
public interface CarFactory{
/**
* 创建发动机
* @return
*/
public Engine creatEngine();
/**
* 创建轮胎
* @return
*/
public Tyre creatTyre();
}
第四步:创建具体的工厂角色
/**
* Created by IntelliJ IDEA.
* User:hubin
* Description:奔驰汽车工厂
* Date:2017/11/29
* Time:14:08
*/
public class BenzFactory implements CarFactory {
/**
* 创建奔驰汽车产品族中的奔驰发动机
* @return
*/
@Override
public Engine creatEngine() {
return new BenzEngine();
}
/**
* 创建奔驰汽车产品族中的奔驰轮胎
* @return
*/
@Override
public Tyre creatTyre() {
return new BenzTyre();
}
}
/**
* Created by IntelliJ IDEA.
* User:hubin
* Description:本田汽车工厂
* Date:2017/11/29
* Time:14:12
*/
public class HondaFactory implements CarFactory{
/**
* 创建本田产品族中的本田引擎
* @return
*/
@Override
public Engine creatEngine() {
return new HondaEngine();
}
/**
* 创建本田产品族中的本田轮胎
* @return
*/
@Override
public Tyre creatTyre() {
return new HondaTyre();
}
}
第5部:测试
/**
* Created by IntelliJ IDEA.
* User:hubin
* Description:
* Date:2017/11/29
* Time:14:17
*/
public class Test {
public static void main(String agrs[]){
/**
* 如果我们需要创建一辆奔驰汽车,
* 只需要创建一个奔驰汽车工厂,
* 就可得到它需要的奔驰发动机和奔驰轮胎
*/
System.out.println("生产一辆奔驰汽车:");
CarFactory Benz = new BenzFactory();
Benz.creatEngine().getEngineInfo();
Benz.creatTyre().getTyreInfo();
/**
* 如果我们需要创建一辆本田汽车,
* 只需要创建一个本田汽车工厂,
* 就可得到它需要的本田发动机和本田轮胎
*/
System.out.println("生产一辆本田汽车:");
CarFactory Honda = new HondaFactory();
Honda.creatEngine().getEngineInfo();
Honda.creatTyre().getTyreInfo();
}
}
运行结果为:
从上面可以看出,抽象工厂模式主要用于解决是创建一组产品(属于同一个产品族)的时候,而不是用于创建一个产品。
以上就是简单工厂模式,工厂方法模式,和抽象工厂模式。