设计模式-12.抽象工厂模式

本文深入解析抽象工厂模式,探讨其定义、使用场景、优缺点及实现方式。通过具体代码示例,展示如何创建一系列相关或相互依赖的对象接口,而不指定具体类。适合希望了解和应用抽象工厂模式的软件开发者。

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

使用场景:创建一系列相关或相互依赖对象的接口

优点:易于改变产品系列

实现:定义各个产品接口及一系列实现类,定义抽象工厂接口,提供创建一系列产品方法,定义工厂实现类,实现创建各个产品方法。

缺点:如果要增加产品,需要修改抽象工厂和具体工厂的方法,增加相应的产品创建方法,不符合开闭原则。这个问题可以用简单工厂模式解决,但是如果要增加已有产品的另一套实现,抽象工厂只需增加一个工厂实现类,简单工厂要修改switch的case分支,又违背了开闭原则。最好的解决办法就是利用反射+抽象工厂+配置文件的方式解决上述问题。所有在用到简单工厂的地方,都可以考虑用反射来去除switch,解除分支带来的耦合。

代码示例:创建一系列操作数据库表的接口,这里接口的实现可以是mysq、oracle等等

/**
 * 数据库项目表操作抽象接口
 * @author liuhao
 *
 */
public interface IProject {
    void insertProject();
}

/**
 * 数据库用户表操作抽象接口
 * @author liuhao
 *
 */
public interface IUser {
    void insertUser();
}

/**
 * mysql项目表操作实现类
 * @author liuhao
 *
 */
public class MysqlProject implements IProject {

    @Override
    public void insertProject() {
        System.out.println("向mysql插入一条项目记录");
    }

}

/**
 * mysql用户表操作实现类
 * @author liuhao
 *
 */
public class MysqlUser implements IUser {

    @Override
    public void insertUser() {
        System.out.println("向mysql插入一条用户记录");
    }

}

/**
 * oracle项目表操作实现类
 * @author liuhao
 *
 */
public class OracleIProject implements IProject {

    @Override
    public void insertProject() {
        System.out.println("向oracle插入一条项目记录");
    }

}
 

/**
 * oracle用户表操作实现类
 * @author liuhao
 *
 */
public class OracleIUer implements IUser {

    @Override
    public void insertUser() {
        System.out.println("向oracle插入一条用户记录");
    }

}

/**
 * 抽象工厂接口
 * @author liuhao
 *
 */
public interface IFactory {
    IUser createIUer();

    IProject createIProject();

}

/**
 * mysql工厂实现类
 * @author liuhao
 *
 */
public class MysqlFactory implements IFactory {

    @Override
    public IUser createIUer() {
        return new MysqlUser();
    }

    @Override
    public IProject createIProject() {
        return new MysqlProject();
    }

}

/**
 * oracle工厂实现类
 * @author liuhao
 *
 */
public class OracleFactory implements IFactory {

    @Override
    public IUser createIUer() {
        return new OracleIUer();
    }

    @Override
    public IProject createIProject() {
        return new OracleIProject();
    }

}

public class Main {
    public static void main(String[] args) {
        IFactory mysqlFactory = new MysqlFactory();
        IUser user = mysqlFactory.createIUer();
        IProject project = mysqlFactory.createIProject();
        user.insertUser();
        project.insertProject();
        
        IFactory oracleFactory = new OracleFactory();
        IUser oUser = oracleFactory.createIUer();
        IProject oProject = oracleFactory.createIProject();
        oUser.insertUser();
        oProject.insertProject();
    }
}

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值