抽象工厂模式
1.1 概念
-
用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
-
抽象工厂模式是工厂模式的升级版(也不能称作是升级版),在有很多个业务品牌、业务分类时,通过抽象工厂模式生产需要的对象是一种非常好的解决方案。
-
一个抽象工厂模式例子的类图:
-
以下是完成这张类图:
- 结构:
- 其中,Seat、Engine、Tyre 是汽车部件,它们三个组成了一条抽象的产品族。在这些接口中,有实现类,分别造出高端的零部件和低端的零部件。然后有一个工厂接口,工厂接口中的方法实现了返回汽车的零部件。然后高端汽车工厂类(LuxuryCarFactory.java)和低端汽车工厂类(LowCarFactory.java)分别实现造高端车的零部件和低端车的零部件(返回实体)。最后,实例化高端汽车工厂类(LuxuryCarFactory.java和低端汽车工厂类(LowCarFactory.java)就可以通过方法创建对象,调用对象的方法。
- 以下是具体的内容;
- Engine.java:
```java
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("启动慢");
}
}
```
- Tyre.java:
```java
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("磨损快");
}
}
```
- Seat.java:
```java
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("不能按摩");
}
}
```
- CarFactory.java
```java
public interface CarFactory {
Engine createEngine();
Seat createSeat();
Tyre createTyre();
}
```
- LuxuryCarFactory.java:
```java
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();
}
}
```
- LowCarFactory.java
```java
public class LowCarFactory implements CarFactory {
@Override
public Engine createEngine() {
return new LowEngine();
}
@Override
public Seat createSeat() {
return new LowSeat();
}
@Override
public Tyre createTyre() {
return new LowTyre();
}
}
```
- Client(main).java
```java
public class Client {
public static void main(String[] args) {
CarFactory factory = new LuxuryCarFactory();
Engine e = factory.createEngine();
e.run();
e.start();
}
}
// 转速快
// 启动快!可以自动启停
```
1.2 总结
抽象工厂模式实际并不像之前的简单工厂模式和工厂方法模式那样可以直接用来增加新的产品。但是它可以用来生产产品族。可以在内部通过返回多个不同的对象,来实现创建产品族的效果。
在抽象工厂类内部再添加一个方法,返回一个对象,也只是在产品族多添加了一个产品,生产出来的还是产品族。
当你使用到抽象工厂时,这个项目就已经非常大,很复杂了。
工厂模式以后可以会和单例模式结合起来,比如servlet就是单例模式和工厂模式结合起来的;spring 中的 IOC 容器创建管理 bean 对象也是 单例模式加工厂模式或者工厂模式加原型模式。所以工厂模式是一个大的模式,会很多模式结合起来。