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下载。