抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类
像上面的汽车车库和自行车车库,使用抽象的工厂方法模式就可以很好的实现,但是这只是针对一种产品业务的,如果要创建一个系列的产品,比如汽车的轮胎,方向盘,座椅,玻璃等,分别对应一个轮胎工厂,方向盘工厂,座椅工厂等,呐现在要多个品牌系列的产品,宝马车的轮胎工厂,方向盘工厂,座椅工厂,和奔驰车的轮胎工厂,方向盘工厂,座椅工厂,那就复杂多了,需要再抽象出一个管理工厂的工厂,也就是抽象工厂模式
工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式
抽象工厂模式是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂,这些由超级工厂创建的工厂可以创造一系列的产品。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的工厂都能按照工厂模式提供对象。
举个例子
充电器和笔记本产品,有厂商品牌戴尔和华为,而且电子期间不能交叉使用,都是要原装,
华为笔记本使用华为充电器,戴尔笔记本使用戴尔充电器;
-
创建抽象产品
/** * 充电器(抽象产品) */ public interface Charger { void getCharger(); } /** * 笔记本(抽象产品) */ public interface NoteBook { void getNoteBook(); }
-
创建具体产品实现抽象产品
/** * Dell笔记本(具体产品) */ public class DellNoteBook implements NoteBook{ public void getNoteBook() { System.out.println("获取Dell笔记本"); } } /** * Dell充电器(具体产品) */ public class DellCharger implements Charger { public void getCharger() { System.out.println("获取Dell充电器"); } } /** * 华为笔记本(具体产品) */ public class HuaWeiNoteBook implements NoteBook { public void getNoteBook() { System.out.println("获取华为笔记本"); } } /** * 华为充电器(具体产品) */ public class HuaWeiCharger implements Charger { public void getCharger() { System.out.println("获取华为充电器"); } }
-
创建抽象工厂
/** * 库房(抽象工厂) */ public abstract class StorageFactory { //获取充电器 public abstract Charger createCharger(); //获取笔记本 public abstract NoteBook createNoteBook(); }
-
创建具体工厂实现抽象工厂
/** * 戴尔库房(具体工厂) */ public class DellStorageFactory extends StorageFactory { /** * 获得戴尔充电器 * @return */ public Charger createCharger() { return new DellCharger(); } /** * 获得戴尔笔记本 * @return */ public NoteBook createNoteBook() { return new DellNoteBook(); } } /** * 华为库房(具体工厂) */ public class HuaWeiStorageFactory extends StorageFactory { /** * 获得华为充电器 * @return */ public Charger createCharger() { return new HuaWeiCharger(); } /** * 获得华为笔记本 * @return */ public NoteBook createNoteBook() { return new HuaWeiNoteBook(); } }
-
根据类型参数获取具体的工厂(理论上仅由抽象产品与抽象工厂实现)
public abstract class StorageFactory { public abstract Charger createCharger(); public abstract NoteBook createNoteBook(); public static StorageFactory storageFactory(String type) { if ("Dell".equals(type)) { return new DellStorageFactory(); } else if ("HuaWei".equals(type)) { return new HuaWeiStorageFactory(); } return null; } }
-
测试调用
@Test public void storageFactory() { String type = "HuaWei"; // String type = "Dell"; StorageFactory dell = StorageFactory.storageFactory(type); Charger charger = dell.createCharger(); charger.getCharger(); NoteBook noteBook = dell.createNoteBook(); noteBook.getNoteBook(); }
-
总结
总之就是将总的获取对象的工厂方法抽象出一个接口或抽象类,由不同的子类工厂实现;
和工厂方法不同的是,可以处理多个产品,例如充电器和笔记本,可能后续还能加入一系列产品显卡,显示屏等
各个类直接的关系
java.sql.Connection接口
java中的数据库sql连接对象java.sql.Connection接口也是抽象工厂模式;
这是这个接口和他的几个抽象方法,就相当于上面的抽象工厂;
public interface Connection {
//提供一个执行对象
Statement createStatement() throws SQLException;
//提供一个支持预编译的执行对象
PreparedStatement prepareStatement(String sql) throws SQLException;
//提供一个支持存储过程的执行对象
CallableStatement prepareCall(String sql) throws SQLException;
}
Statement,PreparedStatement,CallableStatement是这个抽象工厂提供的三个抽象产品
Driver起到Client的作用我们只需要把Driver注册进DriverManager就可以为我们生成需要的Connection每次操作数据库只需要使用java提供的这套接口就可以而不需要考虑我们使用的是什么SQL数据库
抽象工厂与抽象产品均由对应的数据库驱动实现
也就是使用Driver就可以指定确定的工厂来获取产品