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();
}
}

客户端调用方法

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

最新文章

  1. WPF资源使用
  2. opencv 比较直方图方式 进行人脸检测对比
  3. Java 类装载器
  4. 滑动的Button
  5. UVA 562 Dividing coins (01背包)
  6. SCAU 10678 神奇的异或
  7. java NIO 资料总结
  8. C++11: final与override
  9. Delphi 中Format的字符串格式化使用说明(转)
  10. Prince2是怎么考试的?想了解P2
  11. windows系统扩展C盘的工具推荐(解决了C盘和压缩卷不相邻无法扩展C盘问题)
  12. sqlite 数据库 boolean类型的小小测试
  13. json接口返回值
  14. HDU--4486 Task(贪心)
  15. Django+Celery 执行异步任务和定时任务
  16. RabbitMQ Dead Lettering(死信)
  17. border可以这样给控件加边框
  18. OpenGL cullface
  19. 通读《STL源码剖析》之后的一点读书笔记
  20. vuex的实用知识点

热门文章

  1. Android 自定义TextView 实现文本间距
  2. Web 安全 之 OpenSSL
  3. ROS actionlib学习(三)
  4. CAS Maven
  5. Spring Boot优化
  6. CentOS 7 安装配置OpenVPN 2.3.12
  7. [svc]find+xargs/sed&sed后向引用+awk多匹配符+过滤行绝招总结&&产生随机数
  8. 自己实现字符串转整数(不使用JDK的字符串转整数的方法)
  9. Hadoop:HDFS NameNode内存全景
  10. android中通过intent传递复杂数据