设计模式学习--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. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...
随机推荐
- MDX Cookbook 05 - 条件过滤 FILTER-COUNT 与 SUM-IIF 实现
下面的这个查询返回每个财月的 Customer Count 和 基于上个月比较的 Growth in Customer Base 的记录,Slicer 是 Mountain bikes. SELECT ...
- getting-started-with-mqtt
来自:https://dzone.com/refcardz/getting-started-with-mqtt SECTION 1 Why MQTT? The Internet of Things ( ...
- fiddler模拟发送get/post请求(也可做简单接口测试)
1.模拟发送请求 (1)fiddler设置post接口信息及参数,点击execute发送请求 (2)fiddler设置get接口信息及参数,点击execute发送请求 2.发送请 ...
- java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁(转载)
之前做过一个测试,详情见这篇文章<多线程 +1操作的几种实现方式,及效率对比>,当时对这个测试结果很疑惑,反复执行过多次,发现结果是一样的: 1. 单线程下synchronized效率最高 ...
- 训练集测试集划分 train_test_split(X, y, stratify=y)
from sklearn.model_selecting import train_test_spilt() 参数stratify: 依据标签y,按原数据y中各类比例,分配给train和test,使得 ...
- mysql8.0.11修改root密码,其他创建用户和删除用户
1.7. 查询用户密码: 查询用户密码命令:mysql> select host,user,authentication_string from mysql.user; host: 允许用户登录 ...
- Verilog TestBench Coding Style
Abtract 关于编写testbench的一些经验总结心得. Introduction 1.基本的Testbench结构 1)常用的编码结构 `timescale 1 ns / 1 ps ...
- Linux好用的工具命令 - nl/du
nl 添加行号后打印输出文本内容,以下例子演示了cat 和nl 输出nlDemo文档的区别. [root@ptarmiganantelope:~]# cat nlDemo root:x:0:0:roo ...
- ES6,Array.of()函数的用法
ES6为Array增加了of函数用已一种明确的含义将一个或多个值转换成数组. 因为,用new Array()构造数组的时候,是有二意性的. 构造时,传一个参数,表示生成多大的数组. 构造时,传多个参数 ...
- Git 修正错误
大部分的人都会犯错.所以每VCS提供了一个功能,修正错误,直到特定的点. Git提供功能使用,我们可以撤销已作出的修改到本地资源库. 假设用户不小心做了一些更改,以他的本地的仓库,现在他要扔掉这些变化 ...