<十一>读<<大话设计模式>>之抽象工厂模式

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

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

<<大话设计模式>>以项目上线时想换另外一个数据库为例子展开的,假如我没原来用的是SqlServer,现在换成access,代码如下:

1、访问数据库工厂

/**

* @author jzhf

* 2014-11-03

* 创建一个访问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

* 2014-10-31

*/

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、客户端

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就是具体的工厂,这个具体的工厂然后创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应使用不同的具体工厂。

抽象工厂优缺点

优点:易于交换产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。第二个优点是它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。遵循了开放-封闭原则和依赖倒转原则。

缺点也是有的如果我要增加功能,则需要增家三个类,抽象工厂类,工厂具体类和具体实现类,还需要更改原抽象工厂才可以完全实现,非常麻烦。

最后附上结构图:

时间: 2024-10-05 05:01:56

<十一>读<<大话设计模式>>之抽象工厂模式的相关文章

大话设计模式_抽象工厂模式(Java代码)

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. 简单描述:有多种抽象产品,并且每种抽象产品都有多个具体产品.一个抽象工厂,提供多个具体工厂,每个工厂则提供不同种类的具体产品. 大话设计模式中的截图: 例子代码: AbstractProductA类: 1 package com.longsheng.abstractfactory; 2 3 public abstract class AbstractProductA { 4 5 public abstract v

大话设计模式:抽象工厂模式

抽象方法模式:提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们具体的类. 三种模式的对比:   简单工厂模式 工厂模式 抽象工厂模式 产品 可以有多个但是都属于同一类, 同一等级.都继承产品抽象类. 可以有多个但是都属于同一类,同一等级. 都继承产品抽象类. 可以有不同种类的产品,每类有多中 具体产品: 抽象产品 只能有一个 只能有一个; 多个抽象产品类:每个抽象产品类可 以派生多种具体产品: 抽象工厂类   只能有一个,可以派生出多个具体工厂类: 只有一个,可派生出多个具体工厂类:

笔记-大话设计模式-15 抽象工厂模式

抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 所有在用简单工厂的地方,都可以考虑用反射技术来去除switch或if,解除分支判断带来的耦合. Demo: interface IUser { void Insert(User user); User GetUser(int id); } class User { private int _id; public int Id { get { return _id; } set

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

工厂模式虽然简单,但是写下这篇文章却不简单.第一:本人经过内心的挣扎后才决定开始写博文的,为什么呢,因为好长时间没有写了,对自己的文学功底也是好不自信,但是技术这东西你不写出来你真不知道自己掌握多少,或者是否掌握其本质:第二:老婆怀孕了,没时间写了,但是我还是挤出时间开始写,于是这篇文章在这样的环境下成了,以后还有后续的文章,谢谢关注! 为什么从设计模式开始学习呢?其实以前对设计模式有些了解,但是用不到也就没有深入,现在差不多也忘完了,本人工作三年了,对一些大众上的技术(比如struts2.sp

大话设计模式之简单工厂模式&amp;工厂方法模式&amp;抽象工厂模式

创造类模式分为三种:简单工厂模式,工厂模式和抽象工厂模式. 定义: 简单工厂模式:用一个单独的类来做创造实例的过程. 工厂模式:一个用于创建对象的接口,让子类决定实例化哪一个类,讲一个类的实例化 延迟到其子类. 抽象工厂模式:为创建一组相关或相互依赖的对象的类,而不指定具体类. 结构图: 这是简单工厂的结构图,从图中就很好理解. 简单工厂的优点: 根据用户需要,new出需要的对象. 但是简单工厂弊端: 当新加入一个功能是,就要修改工厂.这个时候,就需要工厂模式了. 从图中我们可以看出: 工厂模式

设计模式之抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 最大的好处便是易于交换产品系列,由于具体工厂类,在一个应用中只需在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体工厂即可使用不同的产品配置. 他使具体创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离. 下面的代码还使用了反射与XML. 代码如下: using System; using System.Collections.Ge

设计模式之抽象工厂模式20170803

创建型设计模式之抽象工厂模式: 一.含义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 具体来说, 为一组具有相同约束(属性)的对象,提供一个接口,这个接口下有不同的实现,每个实现类对应一种类型的约束(一种具体的属性),同时提供该类型的约束(属性)下所有对象的创建方法 二.代码说明 1.主要有两个角色 1)一组互相影响的产品线(对象),也叫做产品族 2)抽象工厂类及其实现类 抽象工厂类:在N个产品族中,在抽象工厂类中就应该有N个创建方法 实现类:具体实现类是产品族的具体

大话设计模式_简单工厂模式(Java代码)

简单的描述:一个父类.多个子类,实例化那个子类由一个单独的工厂类来进行 图片摘自大话设计模式: 运算类: 1 package com.longsheng.simpleFactory; 2 3 public class Calculate { 4 5 private double firstNum; 6 private double secondNum; 7 8 public double getFirstNum() { 9 return firstNum; 10 } 11 12 public v

设计模式三—抽象工厂模式

设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是园丁2的杰作 1.Fruit.java public interface Fruit { /* * 生长 * 收获 * 栽种 */ public void grow(); public void harvest(); public void plant(); } 2.Apple.java publi