常用设计模式-抽象工厂


模式简介

工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类:
1. 简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)


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

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

抽象工厂模式的优点

抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。

抽象工厂模式的缺点

产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。

 

实际应用场景

Spring中的BeanFactory


UML类图

案例:数据库切换

IUser
/**
 * @Author l'amour solitaire
 * @Description 用户表操作
 * @Date 2020/11/19 下午3:13
 **/
public interface IUser {

    /**
     * 新增用户
     **/
    void addUser(User user);

}
MysqlUser
/**
 * @Author l'amour solitaire
 * @Description Mysql
 * @Date 2020/11/19 下午3:24
 **/
public class MysqlUser implements IUser {

    @Override
    public void addUser(User user) {
        System.out.println("Mysql 执行了新增用户操作");
    }
}
SqlServerUser
/**
 * @Author l'amour solitaire
 * @Description SqlServer
 * @Date 2020/11/19 下午3:29
 **/
public class SqlServerUser implements IUser {

    @Override
    public void addUser(User user) {
        System.out.println("SqlServer 执行了新增用户操作");
    }
}
DataAccess超级工厂
/**
 * @Author l'amour solitaire
 * @Description 抽象工厂
 * @Date 2020/11/19 下午3:33
 **/
@Data
@AllArgsConstructor
public class DataAccess {

    public static final String MYSQL = "Mysql";
    public static final String SQL_SERVER = "SqlServer";

    private String DB = "SqlServer";

    public IUser createUser() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        String className = String.format("com.aeert.design.abstractfactory.db.%sUser", DB);
        return (IUser) Class.forName(className).newInstance();
    }

}

 

测试

@SpringBootTest
class DesignApplicationTests {

    @Test
    void test() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        new DataAccess(DataAccess.MYSQL).createUser().addUser(new User());
        new DataAccess(DataAccess.SQL_SERVER).createUser().addUser(new User());
    }

}

 

欢迎关注公众号《JAVA拾贝》回复: 设计模式 即可获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA拾贝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值