学习设计模式有一段时间了,对设计模式有一个体会,就是没那么难。就是设计程序遵循一些原则,让代码可复用,在改动的时候不用涉及太多的类,扩展方便。抽象工厂模式名字听起来抽象。但理解起来一点也不抽象,用语言可能不好理解。我喜欢通过代码理解。然后成为自己的东西。

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们详细的类。

<<大话设计模式>>以项目上线时想换另外一个数据库为样例展开的,假如我没原来用的是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代码中。

遵循了开放-封闭原则和依赖倒转原则。

缺点也是有的假设我要添加功能,则须要增家三个类。抽象工厂类。工厂详细类和详细实现类。还须要更改原抽象工厂才干够全然实现,很麻烦。

最后附上结构图:

&lt;十一&gt;读&lt;&lt;大话设计模式&gt;&gt;之抽象工厂模式的更多相关文章

  1. &lt;一&gt;读&lt;&lt;大话设计模式&gt;&gt;之简单工厂模式

    工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...

  2. 《大话设计模式》c++实现 抽象工厂模式

    为了更清晰地理解工厂方法模式,需要先引入两个概念: 产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间 ...

  3. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  4. PHP设计模式(三)抽象工厂模式(Abstract Factory)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...

  5. 设计模式(3)抽象工厂模式(Abstract Factory)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 源码地址 0 抽象工厂模式简介 0.0 抽象工厂模式定义 抽象工厂 ...

  6. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

  7. 《大话设计模式》c++实现 之工厂模式

    工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端 ...

  8. Java设计模式(二)抽象工厂模式

    一.场景描述 接<Java设计模式(一)工厂模式>https://www.cnblogs.com/mahongbiao/p/8618970.html 工厂模式有一缺点,就是破坏了类的封闭性 ...

  9. 大话设计模式之PHP篇 - 简单工厂模式

    假设有一道编程题:输入两个数字和运算符,然后得到运算结果.非常简单的一道题目,通常的实现代码如下: <?php Function Operation($val1, $val2, $operate ...

随机推荐

  1. JavaScript:RegExp 对象

    ylbtech-JavaScript:RegExp 对象 1.返回顶部 RegExp 对象 RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具. 直接量语法 /pattern/att ...

  2. [填坑]解决"Your MaintenanceTool appears to be older than 3.0.2. ."问题

    之前我写过QT5.9版本在更新组件时出现“要继续此操作,至少需要一个有效且已启用的储存库”问题,得到了网友的热心转载,说明遇到此问题的人不在少数. 原文地址:https://blog.csdn.net ...

  3. C++ 模板学习 函数模板、类模板、迭代器模板

    使用模板能够极大到使得代码可重用. 记录一下,方便后续使用. 1. 函数模板,支持多种类型参数 #include <stdio.h> #include <math.h> //函 ...

  4. Backbone.js 中使用 Model

    前面几篇 Backbone.js 的例子中有使用到 template, 及数据的填充,其实这已经很接近 Model 了.现在来学习怎么创建自己的 Model 类,并简单的使用.Backbone.js ...

  5. JS弹出层遮罩,隐藏背景页面滚动条细节优化

    做过弹层组件的童鞋应该都考虑过特殊情况下取消页面滚动条,让其不能滚动,这样用户体验会好很多,当弹层内容超出屏幕展现范围的时候在弹层上面增加滚动条来查看全部内容. 一.去除滚动条方法给body添加ove ...

  6. .NET-分页处理方式

    分页方案一: 现在常见的前端框架datatable,easyui等的分页插件,都是采用的前端分页,原理:先将符合条件的数据全部加载到页面上,然后计算分页,进行分页处理.(装载全部数据) 优点: --在 ...

  7. Java-Shiro(三):Shiro与Spring MVC集成

    新建Java Daynamic Web项目 导入Spring.SpringMVC依赖包: 导入Spring & Spring MVC包(导入如下所有开发包): Spring AOP依赖扩展包: ...

  8. ASP.NET MVC 重命名[命名空间]而导致的错误及发现的ASP.NET MVC Bug一枚

    使用VS2012新建了一个Asp.net mvc5的项目,并把项目的命名空间名称更改了(Src更改为UXXXXX),然后就导致了以下错误 刚开始以后是项目的属性中的命名空间没有更改过来的问题,但我在重 ...

  9. 与IE的战斗

    对第2版的改进,工作量几乎都在UI上,不断的写css,写js,还别说,总体挺愉快的.特别是把360浏览器用顺了之后,烦人的无法刷新问题也不能困扰我了,改了js或者css文件的话,只要清除一下缓存,就可 ...

  10. VC++ MFC应用程序项目文件

    <?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="Bu ...