设计模式学习--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();
}
}
客户端调用方法
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 Method
What Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Why Factory Method是一个比較基 ...
- [学习笔记]设计模式之Abstract Factory
写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 在上篇笔记Builder设计模式中,时の魔导士祭出了自己的WorldCreator.尽管它因此能创造出一个有山有树有房子的世界,但是白 ...
- python之路,Day24 常用设计模式学习
python之路,Day24 常用设计模式学习 本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 ...
- 设计模式——(Abstract Factory)抽象工厂
设计模式——(Abstract Factory)抽象工厂 设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难.你必须设计相关类,并设计类的接口和继承之间的关系.设计必须可以解决当前问题,同 ...
- Java设计模式学习记录-GoF设计模式概述
前言 最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过.前段时间看完了JVM的知识,然后就想着JVM那么费劲的东西都看完了,说明自己学 ...
- C#大话设计模式学习总结
如有雷同,不胜荣欣,如转载,请注明 C#大话设计模式学习总结 一.工厂模式 面向对象的三个特性:封装,继承和多态 1.封装 Class Operate { privatedouble _numberA ...
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- Java设计模式学习笔记(三) 工厂方法模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...
- Java设计模式学习笔记(四) 抽象工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...
随机推荐
- 日志分析利器elk与logback(log4j)实战
https://blog.csdn.net/puhaiyang/article/details/69664891
- CSS实现屏幕显示与打印结果不一样的方法
文章作者:Tony Qu原创 一种方法是为屏幕显示和打印分别准备一个css文件,如下所示: 用于屏幕显示的css: <link rel="stylesheet" href=& ...
- MySQL MySql连接数与线程池
连接数 1. 查看允许的最大并发连接数 SHOW VARIABLES LIKE 'max_connections'; 2. 修改最大连接数 方法1:临时生效 SET GLOBAL max_conn ...
- linux内核剖析(零)linux系统启动过程详解-开机加电后发生了什么
本文参考了如下文章 深入理解linux启动过程 mbr (主引导记录(Master Boot Record)) 电脑从开机加电到操作系统main函数之前执行的过程 详解linux系统的启动过程及系统初 ...
- Effective Java 第三版——58. for-each循环优于传统for循环
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- Android 全局弹出版本更新 Dialog 思考和解决办法
Android 针对版本更新,需要做全局的弹出(需求:版本更新只需要在 App 内全局弹出就可以),思路是使用 AlertDialog ,然后设置 setType 为 TYPE_ALERT_WINDO ...
- 解决CentOS缺少共享库
# ./aapt dump bading ./tmp/app_xxxx.apk ./appt:error while loading shared libraries: libraries: libs ...
- Django登陆以后重定向到请求登陆的页面
登陆和注销操作在网页编程上很常见,这两个操作经常需要在操作成功以后转入发出请求的页面. 比如用户正在浏览一篇文章,发现下载该文章的附件需要登录才能进行,这时候点击登陆链接转入登陆页面,输入用户名密码登 ...
- CodeCombat编程游戏
一. 介绍 官方网站:http://cn.codecombat.com/ 项目地址:https://github.com/codecombat/codecombat CodeCombat 是一个通过玩 ...
- Hadoop 2.x 安装常见问题FAQ(一) NodeManager 无法启动问题解决
一.问题描述 在搭建 Hadoop hadoop-2.4.1 集群的最后一步启动集群,在命令窗口并没有报任何错误,但是Slave 节点的 NodeManager进程始终启动不起来.随后查看了后台启动日 ...