# JAVA设计模式之抽象工厂
1. 定义
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口
无需指定他们具体的类
类型:创建型
2. 适用场景
- 客户端不依赖于产品类实例如何让bb欸创建、实现等细节
- 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码
- 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖具体的实现
3. 优点
- 具体产品在应用层代码隔离,无须关心创建的细节
- 将一系列产品统一到一起创建
4. 缺点
- 规定了所有产品被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
- 增加了系统的抽象性和理解难度
5. 场景说明
如上图所示
产品族有 海信,美的,海尔
产品有空调,冰箱,洗衣机
具体产品就有 海信空调,海信冰箱,海信洗衣机,美的空调,美的冰箱,美的洗衣机,海尔空调,>海尔冰箱,海尔洗衣机,抽象工厂
5. coding
package com.maidou.learning.design.creatation.abstractfactory;
/**
* @Author maicheng
* @Description 产品生产工厂
* @Date 20:40 2022/10/15
**/
public interface IProductFactory {
BinXiang getXiang();
KongTiao getKongTiao();
}
package com.maidou.learning.design.creatation.abstractfactory;
/**
* @Author maicheng
* @Description 海尔生产工厂
* @Date 20:43 2022/10/15
**/
public class HaierFactory implements IProductFactory{
@Override
public BinXiang getXiang() {
return new HaiErBinXiang();
}
@Override
public KongTiao getKongTiao() {
return new HaiErKongTiao();
}
}
package com.maidou.learning.design.creatation.abstractfactory;
/**
* @Author maicheng
* @Description 美的生产工厂
* @Date 20:38 2022/10/15
* @Param
* @return
**/
public class MeiDiFactory implements IProductFactory{
@Override
public BinXiang getXiang() {
return new MeiDiBinXiang();
}
@Override
public KongTiao getKongTiao() {
return new MeiDiKongTiao();
}
}
package com.maidou.learning.design.creatation.abstractfactory;
/**
* @Author maicheng
* @Description 冰箱抽象工厂
* @Date 20:42 2022/10/15
**/
public abstract class BinXiang {
public abstract void produce();
}
package com.maidou.learning.design.creatation.abstractfactory;
/**
* @Author maicheng
* @Description 空调抽象
* @Date 20:42 2022/10/15
**/
public abstract class KongTiao {
public abstract void produce();
}
package com.maidou.learning.design.creatation.abstractfactory;
/**
* @Author maicheng
* @Description 海尔冰箱
* @Date 20:36 2022/10/15
**/
public class HaiErBinXiang extends BinXiang {
@Override
public void produce() {
System.out.println("海尔冰箱");
}
}
package com.maidou.learning.design.creatation.abstractfactory;
/**
* @Author maicheng
* @Description 海尔空调
* @Date 20:36 2022/10/15
**/
public class HaiErKongTiao extends KongTiao {
@Override
public void produce() {
System.out.println("海尔空调");
}
}
package com.maidou.learning.design.creatation.abstractfactory;
/**
* @Author maicheng
* @Description 美的冰箱
* @Date 20:39 2022/10/15
**/
public class MeiDiBinXiang extends BinXiang {
@Override
public void produce() {
System.out.println("美的冰箱");
}
}
package com.maidou.learning.design.creatation.abstractfactory;
/**
* @Author maicheng
* @Description 美的冰箱
* @Date 20:39 2022/10/15
**/
public class MeiDiBinXiang extends BinXiang {
@Override
public void produce() {
System.out.println("美的冰箱");
}
}
package com.maidou.learning.design.creatation.abstractfactory;
public class Test {
public static void main(String[] args) {
IProductFactory haierFactory = new HaierFactory();
KongTiao haierFactoryKongTiao = haierFactory.getKongTiao();
haierFactoryKongTiao.produce();
BinXiang haierFactoryXiang = haierFactory.getXiang();
haierFactoryXiang.produce();
IProductFactory meiDiFactory = new MeiDiFactory();
KongTiao meiDiFactoryKongTiao = meiDiFactory.getKongTiao();
meiDiFactoryKongTiao.produce();
BinXiang meiDiFactoryXiang = meiDiFactory.getXiang();
meiDiFactoryXiang.produce();
}
}
6. 源码
-
java.sql.Connection
-
java.sql.Statement
-
mybatis SqlSessionFactory
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Transaction tx = null; DefaultSqlSession var8; try { Environment environment = this.configuration.getEnvironment(); TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment); tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); Executor executor = this.configuration.newExecutor(tx, execType); var8 = new DefaultSqlSession(this.configuration, executor, autoCommit); } catch (Exception var12) { this.closeTransaction(tx); throw ExceptionFactory.wrapException("Error opening session. Cause: " + var12, var12); } finally { ErrorContext.instance().reset(); } return var8; }