抽象工厂模式
- 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂,因此又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
- 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的工厂都能按照工厂模式提供对象。
- 抽象工厂用于生产产品族,不可以增加单个产品,但可以增加产品族。
介绍
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
使用场景:
- QQ 换皮肤,一整套一起换
- 生成不同操作系统的程序
注意事项:产品族难扩展,产品等级易扩展。
实现:
步骤1:创建汽车各组件(引擎、座位、轮胎)的抽象接口和相应的具体实现类
package com.ly.abstractFactory;
public interface Engine {
void start();
void run();
}
class LuxuryEngine implements Engine {
@Override
public void start() {
System.out.println("LuxuryEngine --> start quickly");
}
@Override
public void run() {
System.out.println("转的快!");
}
}
class LowEngine implements Engine {
@Override
public void start() {
System.out.println("LowEngine --> start slowly");
}
@Override
public void run() {
System.out.println("转的慢!");
}
}
package com.ly.abstractFactory;
public interface Seat {
void massage();
}
class LuxurySeat implements Seat {
@Override
public void massage() {
System.out.println("have the function of massage");
}
}
class LowSeat implements Seat {
@Override
public void massage() {
System.out.println("no function of massage");
}
}
package com.ly.abstractFactory;
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("易磨损,易打滑");
}
}
步骤2:创建一个抽象的汽车工厂
package com.ly.abstractFactory;
public interface CarFactory {
Engine createEngine();
Seat createSeat();
Tyre createTyre();
}
步骤3:创建汽车工厂的具体工厂类型
package com.ly.abstractFactory;
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();
}
}
package com.ly.abstractFactory;
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();
}
}
步骤4:客户端测试
package com.ly.abstractFactory;
/**
* 1、测试抽象工厂
* liyang 2020-07-12
* 2、抽象工厂用于生产产品族
* 3、不可以增加单个产品,但可以增加产品族
* 比如这里的高端产品线(族)包括引擎、座椅和轮胎
* 4、工厂模式的主要应用场景(很多情况下会和其他模式配合,比如单例模式)
* jdk中Calender的getInstance方法
* JDBC中Connection对象的获取
* Hibernate中SessionFactory创建Session
* Spring中IOC容器创建管理bean对象
* XML解析时的DocumentBuilderFactory创建解析器对象
* 反射中Class对象的newInstance()
*/
public class Client {
public static void main(String[] args) {
//开始创建高端产品
System.out.println("开始创建高端产品线产品");
//创建抽象工厂的具体实现类工厂对象
CarFactory luxuryCarFactory = new LuxuryCarFactory();
//通过具体实现类工厂对象中的相应方法创建该工厂的相应产品engine
Engine luxuryEngine = luxuryCarFactory.createEngine();
//被创建产品具有的方法
luxuryEngine.start();
luxuryEngine.run();
//通过具体实现类工厂对象中的相应方法创建该工厂的相应产品seat
Seat luxurySeat = luxuryCarFactory.createSeat();
//被创建产品具有的方法
luxurySeat.massage();
//通过具体实现类工厂对象中的相应方法创建该工厂的相应产品tyre
Tyre luxuryTyre = luxuryCarFactory.createTyre();
//被创建产品具有的方法
luxuryTyre.revolve();
//创建高端产品线结束
System.out.println("结束高端产品线");
//清晰起见,间隔一行
System.out.println();
//开始创建低端产品
System.out.println("开始创建低端产品线产品");
//创建抽象工厂的具体实现类工厂对象
CarFactory lowCarFactory = new LowCarFactory();
//通过具体实现类工厂对象中的相应方法创建该工厂的相应产品engine
Engine lowEngine = lowCarFactory.createEngine();
//被创建产品具有的方法
lowEngine.start();
lowEngine.run();
//通过具体实现类工厂对象中的相应方法创建该工厂的相应产品seat
Seat lowSeat = lowCarFactory.createSeat();
//被创建产品具有的方法
lowSeat.massage();
//通过具体实现类工厂对象中的相应方法创建该工厂的相应产品tyre
Tyre lowTyre = lowCarFactory.createTyre();
//被创建产品具有的方法
lowTyre.revolve();
//创建低端产品线结束
System.out.println("结束低端产品线");
}
}
结果:
开始创建高端产品线产品
LuxuryEngine --> start quickly
转的快!
have the function of massage
耐磨损,防打滑
结束高端产品线
开始创建低端产品线产品
LowEngine --> start slowly
转的慢!
no function of massage
易磨损,易打滑
结束低端产品线
Process finished with exit code 0
工厂模式要点:
- 简单工厂模式:又叫静态工厂模式,虽然某种程度不符合设计原则,但实际使用最多
- 工厂方法模式:不修改已有类的情况下,通过增加新的工厂类实现扩展
- 抽象工厂模式:不可以增加产品,可以增加产品族
参考资料:
https://www.runoob/design-pattern/abstract-factory-pattern.html
更多推荐
抽象工厂模式的Java实现
发布评论