本文借助jdk中实现jdbc的原理来描述描述一下抽象工厂模式,首先定义两个抽象接口:连接接口和命令接口。

interface IConnect{
    void connect();
}
interface ICommand{
    void command();
}

此时再定义一个数据库操作util用来对数据库进行抽象对数据库进行处理。

interface IDatabaseUtils{
    IConnect getConnect();
    ICommand getCommand();
}

此时如果我们使用mysql作为数据库使用,那么具体实现一下数据库连接接口、数据库命令接口和mysql工具类。

class MysqlConnect implements IConnect{

    @Override
    public void connect() {
        System.out.println("connect mysql ...");
    }
}
class MysqlCommand implements ICommand{

    @Override
    public void command() {
        System.out.println("mysql command...");
    }
}

class MysqlUtils implements IDatabaseUtils{

    @Override
    public IConnect getConnect() {
        return new MysqlConnect();
    }

    @Override
    public ICommand getCommand() {
        return new MysqlCommand();
    }
}

假如封装到一个jar包中给所有人使用时,缺少oracle处理工具,我们只需要再具体实现一下数据库连接接口、数据库命令接口和oracle工具类,而不需要去动原有代码

class OracleConnect implements IConnect{

    @Override
    public void connect() {
        System.out.println("connect oracle ...");
    }
}
class OracleCommand implements ICommand{

    @Override
    public void command() {
        System.out.println("oracle command...");
    }
}

class OracleUtils implements IDatabaseUtils{

    @Override
    public IConnect getConnect() {
        return new OracleConnect();
    }

    @Override
    public ICommand getCommand() {
        return new OracleCommand();
    }
}

对于上面的示例代码,我们可以通过下面这种方式简单调用,通过IDatabaseUtils引用而不需要关注被调用的具体实现细节

public class AbstractFactoryTest {
    public static void main(String[] args) {
        IDatabaseUtils iDatabaseUtils = new OracleUtils();

        // 不再需要关注被调用的具体细节
        iDatabaseUtils.getConnect().connect();
        iDatabaseUtils.getCommand().command();
    }
}

总结:抽象工厂模式就是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。优点:1.可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理;2.当增加一个新的产品族时不需要修改原代码,满足开闭原则。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。