JAVA设计模式之抽象工厂

# JAVA设计模式之抽象工厂

1. 定义

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口
无需指定他们具体的类

类型:创建型

2. 适用场景

  1. 客户端不依赖于产品类实例如何让bb欸创建、实现等细节
  2. 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码
  3. 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖具体的实现

3. 优点

  1. 具体产品在应用层代码隔离,无须关心创建的细节
  2. 将一系列产品统一到一起创建

4. 缺点

  1. 规定了所有产品被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
  2. 增加了系统的抽象性和理解难度

5. 场景说明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xa9Y4aZl-1665847518707)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221015132938350.png)]

如上图所示
产品族有 海信,美的,海尔
产品有空调,冰箱,洗衣机
具体产品就有 海信空调,海信冰箱,海信洗衣机,美的空调,美的冰箱,美的洗衣机,海尔空调,>海尔冰箱,海尔洗衣机,抽象工厂

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();

    }
}

image-20221015231244994

6. 源码

  1. java.sql.Connection

  2. java.sql.Statement

  3. 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;
        }
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值