设计模式学习--Abstarct Factory

Posted yangykaifa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式学习--Abstarct Factory相关的知识,希望对你有一定的参考价值。

What

Abstarct Factory:提供一个创建一系列相关或相互依赖的接口。而无需指定他们详细类。

Why

Abstarct Factory是创建型设计模式的一种,主要在创建对象时解耦,避免对象的直接依赖,方便替换与定制。常见的比方:一个功能有两种不同的风格,须要依据配置来切换不同的风格时。或者在一个须要适用于多个数据库切换的程序中,都会使用Abstact Factory。
适用于Abstarct Factory的场景:
1、系统的展现或者功能须要可配置时。


2、系统模块的创建,须要独立于系统模块时。


3、系统须要动态定制时。

How

如果例如以下场景,在编写数据库訪问层时,须要支持两种数据库的切换。比方能够支持sqlserver和mysql的切换。

以这个简单的样例,说明Abstarct Factory的实现
首先我们定义我们的dao接口:

public interface UserDao {

    void insert(User user);

    void delete(String id);

    User find(String id);
}

这个接口须要三个简单的方法。插入。删除,查询
定义用于创建Dao实例的工厂接口

public interface DaoFactory {

    UserDao create();

}

用于訪问sqlserver的UserDao的实现

public class SqlServerUserDaoImpl implements UserDao {

    @Override
    public void insert(User user) {
        System.out.println("sqlserver insert user");
    }

    @Override
    public void delete(String id) {
        System.out.println("sqlserver delete user");
    }

    @Override
    public User find(String id) {
        System.out.println("sqlserver find user");
        return null;
    }
}

用于訪问mysql的UserDao的实现

public class MysqlUserDaoImpl implements UserDao {

    @Override
    public void insert(User user) {
        System.out.println("mysql insert user");
    }

    @Override
    public void delete(String id) {
        System.out.println("mysql delete user");
    }

    @Override
    public User find(String id) {
        System.out.println("mysql find user");
        return null;
    }
}

用于创建sqlserver userDao的工厂

public class SqlserverDaoFactoryImpl implements DaoFactory {

    @Override
    public UserDao create() {
        return new SqlServerUserDaoImpl();
    }
}

用于创建mysql userDao的工厂

public class MysqlDaoFactoryImpl implements DaoFactory {

    @Override
    public UserDao create() {
        return new MysqlUserDaoImpl();
    }
}

client调用方法

public class App {

    public static void main( String[] args ){

        DaoFactory daoFactory=new MysqlDaoFactoryImpl();
        UserDao userDao=daoFactory.create();
        userDao.insert(null);

        DaoFactory daoFactory1=new SqlserverDaoFactoryImpl();
        UserDao userDao1=daoFactory1.create();
        userDao1.delete("");
    }
}

以上实例的类图例如以下:
技术分享

Discuss

在以上的样例中。还能够延伸到把数据库的选择写在配置文件里。然后在系统启动时依据配置通过反射载入不同的程序,这个在曾经使用c#做一个系统时用到过。在java的web开发中,一般使用spring框架,它提供了IOC技术,通过配置bean来做数据源的初始化。


在spring的源码中,也有Abstract Factory的使用,比方BeanFactory就是一个样例,当然它的设计要比本文中的样例,复杂的多。

ChangeLog

在学习时发现本节演示样例不够完好,所以进行了完好,添加在ChangeLog中,两者的差别和联系在设计模式学习--Factory Method的Discuss章节中。
演示样例代码基于以上演示样例改动。假设理解了演示样例中的代码,改动为例如以下结构的代码比較简单就不在帖出,也能够到去我的GitHub下载。
技术分享













以上是关于设计模式学习--Abstarct Factory的主要内容,如果未能解决你的问题,请参考以下文章

factory工厂模式

终极办法org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘helloC(代

终极办法org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘helloC(代

(C++设计模式) —— 常见设计模式学习笔记 - Factory模式(工厂)

(C++设计模式) —— 常见设计模式学习笔记 - Factory模式(工厂)

随手记录关于Factory method 'eurekaApplicationInfoManager' threw exception; nested exception is j(代