抽象工厂模式

抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类

像上面的汽车车库和自行车车库,使用抽象的工厂方法模式就可以很好的实现,但是这只是针对一种产品业务的,如果要创建一个系列的产品,比如汽车的轮胎,方向盘,座椅,玻璃等,分别对应一个轮胎工厂,方向盘工厂,座椅工厂等,呐现在要多个品牌系列的产品,宝马车的轮胎工厂,方向盘工厂,座椅工厂,和奔驰车的轮胎工厂,方向盘工厂,座椅工厂,那就复杂多了,需要再抽象出一个管理工厂的工厂,也就是抽象工厂模式

工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式

抽象工厂模式是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂,这些由超级工厂创建的工厂可以创造一系列的产品。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的工厂都能按照工厂模式提供对象。

举个例子

充电器和笔记本产品,有厂商品牌戴尔和华为,而且电子期间不能交叉使用,都是要原装,

华为笔记本使用华为充电器,戴尔笔记本使用戴尔充电器;

  1. 创建抽象产品

    /**
     * 充电器(抽象产品)
     */
    public interface Charger {
        void getCharger();
    }
    
    /**
     * 笔记本(抽象产品)
     */
    public interface NoteBook {
        void getNoteBook();
    }
    
  2. 创建具体产品实现抽象产品

    /**
     * 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("获取华为充电器");
        }
    }
    
  3. 创建抽象工厂

    /**
     * 库房(抽象工厂)
     */
    public abstract class StorageFactory {
        //获取充电器
        public abstract Charger createCharger();
        //获取笔记本
        public abstract NoteBook createNoteBook();
    }
    
  4. 创建具体工厂实现抽象工厂

    /**
     * 戴尔库房(具体工厂)
     */
    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();
        }
    }
    
  5. 根据类型参数获取具体的工厂(理论上仅由抽象产品与抽象工厂实现)

    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;
        }
    }
    
  6. 测试调用

        @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();
        }
    
  7. 总结

    总之就是将总的获取对象的工厂方法抽象出一个接口或抽象类,由不同的子类工厂实现;

    和工厂方法不同的是,可以处理多个产品,例如充电器和笔记本,可能后续还能加入一系列产品显卡,显示屏等

各个类直接的关系

在这里插入图片描述

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就可以指定确定的工厂来获取产品

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值