<十一>读<<大话设计模式>>之抽象工厂模式
学习设计模式有一段时间了,对设计模式有一个体会,就是没那么难。就是设计程序遵循一些原则,让代码可复用,在改动的时候不用涉及太多的类,扩展方便。抽象工厂模式名字听起来抽象。但理解起来一点也不抽象,用语言可能不好理解。我喜欢通过代码理解。然后成为自己的东西。
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们详细的类。
<<大话设计模式>>以项目上线时想换另外一个数据库为样例展开的,假如我没原来用的是SqlServer,如今换成access,代码例如以下:
1、訪问数据库工厂
/**
* @author jzhf
* 创建一个訪问user的工厂接口
*/
public
interface IFactory {
IUser createUser();
IDepartment createDepartment();
}
IUser指的是对用户表的操作,IDepartment指的是对部门表的操作,关于这两个类在以下有介绍。
2、SqlServer数据库工厂类操作
public
class SqlServerFactory implements IFactory {
/* (non-Javadoc)
* @seecom.test.model.abstractFactory.IFactory#createUser()
*/
public IUser createUser() {
// TODO Auto-generatedmethod stub
return
new SqlServerUser();
}
/* (non-Javadoc)
* @seecom.test.model.abstractFactory.IFactory#createDepartment()
*/
public IDepartment createDepartment() {
// TODO Auto-generatedmethod stub
return
new SqlServerDepartment();
}
}
3、详细类,对user操作
/**
* @author jzhf
*/
public
class SqlServerUser implements IUser {
/* (non-Javadoc)
* @seecom.test.model.abstractFactory.IUser#getUser(int)
*/
public
void getUser(int id) {
// TODO Auto-generatedmethod stub
System.out.println("sqlserverget User by Id");
}
/* (non-Javadoc)
* @seecom.test.model.abstractFactory.IUser#insert(com.test.model.abstractFactory.User)
*/
public
void insert(User user) {
// TODO Auto-generatedmethod stub
System.out.println("sqlserverinsert user");
}
}
4、用户接口
public
interface IUser {
void insert(User user);
void getUser(int id);
}
5、部门类与用户代码差点儿相同。略。access数据库代码与SqlServer数据库代码一致,略
6、client
public
class UserClient {
/**
* @param args
*/
public
static void main(String[] args) {
// TODO Auto-generatedmethod stub
IFactory factory = new SqlServerFactory();
IUser iUser = factory.createUser();
User user = new User();
user.setId(0);
user.setName("小王");
iUser.insert(user);
iUser.getUser(0);
IFactory factory2 = new AccessFactory();
IUser iUser2 = factory2.createUser();
iUser2.insert(user);
iUser2.getUser(0);
//-----------添加部门接口之后-----------
IDepartment iDepartment = factory.createDepartment();
//然后改动insert传入的值
}
}
从代码和以下的图标能够看到,IFactory是抽象工厂接口。它里面包括全部的产品创建的抽象方法,而SqlServerFactory和accessFactory就是详细的工厂,这个详细的工厂然后创建具有特定实现的产品对象。也就是说,为创建不同的产品对象。client应使用不同的详细工厂。
抽象工厂优缺点
长处:易于交换产品系列,因为详细工厂类,在一个应用中仅仅须要在初始化的时候出现一次,这就使得改变一个应用的详细工厂变得很easy,它仅仅须要改变详细工厂就可以使用不同的产品配置。第二个长处是它让详细的创建实例过程与client分离,client是通过它们的抽象接口操纵实例。产品的详细类名也被详细工厂的实现分离,不会出如今client代码中。
遵循了开放-封闭原则和依赖倒转原则。
缺点也是有的假设我要添加功能,则须要增家三个类。抽象工厂类。工厂详细类和详细实现类。还须要更改原抽象工厂才干够全然实现,很麻烦。
最后附上结构图:
<十一>读<<大话设计模式>>之抽象工厂模式的更多相关文章
- <一>读<<大话设计模式>>之简单工厂模式
工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...
- 《大话设计模式》c++实现 抽象工厂模式
为了更清晰地理解工厂方法模式,需要先引入两个概念: 产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间 ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- PHP设计模式(三)抽象工厂模式(Abstract Factory)
一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...
- 设计模式(3)抽象工厂模式(Abstract Factory)
设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 源码地址 0 抽象工厂模式简介 0.0 抽象工厂模式定义 抽象工厂 ...
- Java设计模式学习笔记(四) 抽象工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...
- 《大话设计模式》c++实现 之工厂模式
工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端 ...
- Java设计模式(二)抽象工厂模式
一.场景描述 接<Java设计模式(一)工厂模式>https://www.cnblogs.com/mahongbiao/p/8618970.html 工厂模式有一缺点,就是破坏了类的封闭性 ...
- 大话设计模式之PHP篇 - 简单工厂模式
假设有一道编程题:输入两个数字和运算符,然后得到运算结果.非常简单的一道题目,通常的实现代码如下: <?php Function Operation($val1, $val2, $operate ...
随机推荐
- linux驱动编写(电源管理驱动)
对于嵌入式设备来说,合适的电源管理,不仅可以延长电池的寿命,而且可以省电,延长设备运行时间,在提高用户体验方面有很大的好处.所以,各个soc厂家在这方面花了很多的功夫.下面,我们可以看看linux是如 ...
- [转载]设置Chrome忽略网站证书错误
某些用户可能经常会遇到Chrome浏览器提示网站证书错误的情况,尤其是在Google升级证书检查力度之后,访问Google时已经不能在浏览器界面中忽略证书错误访问. 比如说公司的IT修改过证书就会遇到 ...
- C# 播放铃声最简短的代码实现方式
因为只是做一个软件的闹铃播放效果,到网上找的时候试了几种,哎,都失败了,而且代码挺杂的,最终一句搞定了: 1 // 窗体加载事件 2 private void Time ...
- PL/SQL Developer执行.sql文件的几种方法
1.复制SQL 第一种方法非常常见,也非常简单,先用文本编辑器打开.sql文件,然后把sql复制到PL/SQL Developer的SQL窗口或者命令窗口中运行就行了,本来我也是这么做的,但是我将SQ ...
- OpenNebula学习第三节之虚拟机管理
一.背景 已经安装好OpenNebula-Front-end 已经安装好OpenNebula Node 已经把Node注册到Front-end 二.目标 看过第一.二节的同学们可能已经知道我的整个环境 ...
- Node js : Best way to define entity class
If you start to use a DB like mongo, you might be better off creating objects with mongoose but th ...
- ASP入门(十四)-FileSystemObject 对象
File Access 组件中常见的对象有 FileSystemObject.TextStream.File.Folder.Drive等,其中每一个对象都有不同的属性和方法,我们将会在用到的时候进行详 ...
- Android Studio 上传aar(Library)到JCenter
目的 这篇文章介绍通过Gradle把开源项目发布到公共仓库JCenter中,发布自己的android library(也就是aar)到公共的jcenter仓库. 为什么选择JCenter,因为JCen ...
- 【mybatis】多次查询缓存的问题
转自:http://cheng-xinwei.iteye.com/blog/2021700?utm_source=tuicool&utm_medium=referral 最近在使用mybati ...
- jetty 9使用
jetty 9 使用 下载jdk 7 http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-ja ...