`
renyanwei
  • 浏览: 70886 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

抽象工厂其实就是这么简单

阅读更多

抽象工厂,是简单工厂的加强版,呵呵,比后者更加抽象化了,不过,的确很好用。

 

抽象工厂可以这么理解,你要到商场里去买衣服,好了,就这么多,就可以是抽象工厂模式,首先,你到商场里去买衣服,但是商场是抽象的,是不存在的,只是一个概念,那么,你要到哪个商场里去买衣服呢? 丹尼斯百货? 恩 这就是实实在在存在的商场了, 呵呵, 再者, 你要去买衣服,衣服也是抽象的,不存在的, 哦,我要去买CK内裤,哦 ,这就是实实在在的的衣服了,所以,这里可以理解为:

商场(抽象工厂)

丹尼斯百货(实体工厂)

衣服(抽象产品)

CK内裤(实体产品)

 

这里我们有一个需求,就是我要从数据库里分别读取学生和教师的姓名。就这么简单,但是,要求能在不同的数据库上移植。好了,我们现在分析,因为我们交给客户的都是直接编译好的class文件,所以,不要说去动源代码,其实我们可以用抽象工厂模式很好的解决这个问题,首先,我们看一个图

 

 

 

创建出抽象产品,就是规定你的实体产品必须实现什么功能,在这里我们只要求实体产品能够给我们提供返回学生或教师的姓名就就可以了

/*
*	定义接口IStudentService
*	
*	规定所以实体产品必须能够返回学员姓名
*/
package MySchool.ISchoolService;

public interface IStudentService
{
	String getStudentName();
}

/*
*	定义接口ITeacherService
*	
*	规定所以实体产品必须能够返回教师姓名
*/
package MySchool.ISchoolService;

public interface ITeacherService
{
	String getTeacherName();
}

 

我们创建出抽象工厂来,就是定义实体工厂都能生产出什么东西来,在这里只要能创建出学生和教师的数据库操作类就可以了

/*
*	抽象工厂类 AbsFactory
*	
*	负责定义实体工厂所必须实现功能
*/
package MySchool.AbsFactory;

import MySchool.ISchoolService;

public abstract AbsFactory  
{
	abstract IStudentService getStudentService();
	abstract ITeacherService getTeacherService();
}
 

 

这样我们就可以创建出实体产品了

 

//
//	Mysql工厂能生产的两种产品
//
package MySchool.MySQLService;

import MySchool.ISchoolService;

public class StudentService implements IStudentService
{
	public String getStudentName()
	{
		return "这里是从Mysql里读取到的学生姓名";
	}
}

package MySchool.MySQLService;

import MySchool.ISchoolService;

public class TeacherService implements ITeacherService
{
	public String getTeacherName()
	{
		return "这里是从Mysql里读取到的教师姓名";
	}
}


//
//	SQL Server工厂能生产的两种产品
//
package MySchool.SQLServerService;

import MySchool.ISchoolService;

public class StudentService implements IStudentService
{
	public String getStudentName()
	{
		return "这里是从SQL Server里读取到的学生姓名";
	}
}
package School.SQLServerService;

import MySchool.ISchoolService;

public class TeacherService implements ITeacherService
{
	public String getTeacherName()
	{
		return "这里是从SQL Server里读取到的教师姓名";
	}
}

 接下来我们创建出各个实体工厂

 

//
//	MySQL实体工厂,能够生产出学生和教师的操作类
//
package MySchool.MySQLFactory

import MySchool.ISchoolService;
import MySchool.AbsFactory;
import MySchool.MySQLService;

public class MySQLFactory extends AbsFactory
{
	public IStudentService getStudentService()
	{
		return new StudentService();
	}
	public ITeacherService getTeacherService()
	{
		return new TeacherService();
	}
}
//
//	SQL Server实体工厂,能够生产出学生和教师的操作类
//
package MySchool.SQLServerFactory

import MySchool.ISchoolService;
import MySchool.AbsFactory;
import MySchool.SQLServerService;

public class SQLServerFactory extends AbsFactory
{
	public IStudentService getStudentService()
	{
		return new StudentService();
	}
	public ITeacherService getTeacherService()
	{
		return new TeacherService();
	}
}

 

既然我们能够在不改动代码的情况下移植数据库,那么我们就可以利用JAVA的反射技术来读取XML配置文件来动态改变访问具体数据库,我们来改写抽象工厂代码:

/*
*	抽象工厂类 AbsFactory
*	
*	负责定义实体工厂所必须实现功能
*/
package MySchool.AbsFactory;

import MySchool.ISchoolService;
import MySchool.SQLServerFactory;
import MySchool.MySQLFactory;

public abstract AbsFactory  
{
	AbsFactory _factory=null;
	public static absFactory getFactory()
	{
		//这里是读取XML和反射阶段,反射等以后再说,现在先假定是MySQL
              //根据里氏替换原则
		_factory=new MySQLFactory();
		return _factory;
	}
	abstract IStudentService getStudentService();
	abstract ITeacherService getTeacherService();
}

 好了,现在我们再在业务逻辑层来调用查询学员或教师姓名的时候就可以这样来写,这里也用到了里氏替换原则

package MySchool.ShoolManager;

import MySchool.AbsFactory;
import MySchool.ISchoolService;

public class StudentManager  
{
	public String getStudentName()
	{
		IStudentService stuservice=AbsFactory.getFactory().getStudentService();
		String name=stuservice.getStudentName();
		return name;
	}
	
}

 这样 只需要配置XML就可以实现移植数据库功能了,当然,抽象工厂设计模式的应用绝非仅限于此,能不能把它玩转,就靠我们的造化了, 呵呵  还是 那样。 如果有错误的话还是请帮忙指出来, 其实模式是非常灵活的,没必要死板硬套,只要有那么点儿意思就可以了  O(∩_∩)O哈哈~

声明一点儿,代码是我用EditPus顺手捏来的,懒得动MyEclipse了,写出来只是作自己存起来日后看的,有个分号没加啊什么的就见谅了

6
1
分享到:
评论
6 楼 huyuhong001 2008-10-24  
[/align][/color]
引用
[color=orange]
引用
[/size][size=medium][align=center]
  • 你那图是用什么工具画出来的?我也好想画这种图,但是不知道用什么工具,谢谢!
引用
[/i][b][/b][i][/color][color=red][size=small][/size][align=center][/align]
[img][/img][/url][flash=200,200]" wmode="" quality="high" menu="false" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="200" height="200">[url][img][/img]
5 楼 lkjust08 2008-10-24  
LZ能力不错,理解的很好,向你学习呀
4 楼 utyphoon 2008-10-24  
不错不错,收藏
3 楼 pignut_wang 2008-10-23  
http://pignut-wang.iteye.com/blog/254676

看看这本书,简直是学习设计模式的终极武器,图文结合,一看就懂
2 楼 niunan 2008-10-23  
学习了。。。。我也想知道那个图是怎么画出来的?
1 楼 WaterSugar 2008-10-23  

顺便弱弱的问一下,你那图是用什么工具画出来的?我也好想画这种图,但是不知道用什么工具,谢谢!

相关推荐

    3. 工厂模式1

    它可以分为简单工厂模式、工厂模式以及抽象工厂模式。以下是对工厂模式的详细介绍: 简单工厂模式 简单工厂模式是一种最基本的工厂模式,它的主要作用是根据不同的参数选择不同的解析器。例如,在数据解析器中,...

    深入浅出设计模式之工厂模式

    - **具体工厂**(Concrete Factory):实现了抽象工厂接口,用于创建具体的产品对象。 - **产品接口**(Product Interface):定义了产品的规范,是所有产品的公共接口。 - **具体产品**(Concrete Product):实现...

    常用的模式工厂设计模式

    无论是简单的工厂方法模式还是更复杂的抽象工厂模式,都能够帮助开发者更好地组织代码结构,减少代码间的耦合,使得系统更容易维护和扩展。在实际开发过程中,合理利用工厂模式可以极大地提升代码质量和开发效率。

    重构36计-其实很简单

    在某些场景下,可以考虑重用对象或者使用静态工厂方法来减少临时对象的创建。例如,如果一个方法内部创建了大量的短生命周期对象,可以考虑创建一个池来管理这些对象,从而提高性能。 第九计:避免重复的代码(DRY...

    深入c#工厂模式的详解

    工厂模式其实就是抽象出一个工厂,我需要什么手机,去哪个工厂买就行了。我不必关心他的制作过程,你只要能生产我要的功能的手机就行。所以我们需要引入简单工厂,让我们不用再关心手机怎么生产的,具体代码的实现见...

    设计模式的delphi实现

    Delphi提供了TNotifyEvent事件机制,这其实就是一个简单的观察者模式实现。 8. **命令模式**:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的...

    二十三种设计模式【PDF版】

    设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. 设计模式之 Builder 汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这...

    java与模式源码-DesignPatterns:java设计模式与

    抽象工厂模式 抽象⼯厂是一个中心⼯厂,创建其他⼯厂的模式。 抽象⼯厂模式,所要解决的问题就是在⼀个产品族,存在多个不同类型的产品(Redis集群、操作系 统)情况下,接⼝选择的问题。⽽这种场景在业务开发中也是⾮...

    Java 24种设计模式

    抽象工厂模式是一种提供一系列相关或相互依赖对象的接口,而无需指定它们具体的类的设计模式。它关注的是创建一组相关的或相互依赖的对象,而非单个对象。 **应用场景:** 当你需要创建一组相关的产品族时,例如...

    JAVA核心技术

    这本书讲了23种主要的模式,包括:抽象工厂、适配器、外观模式等。??还有其他的很多模式,估计有100多种。??软件设计模式太多,就我的理解简单说一下最常见的MVC模式。??MVC模式是1996年由Buschmann提出的:??模型...

    Java URL类getContent()方法的技术内幕与纯文本处理器的实现.pdf

    其实,URLConnection对象已经能够确定资源的准确MIME类型。给定MIME类型后,工厂就可以生成ContentHandler的子类来处理这类内容。 二、ContentHandler类的实现 从ContentHandler类的简单定义中,我们发现了一个...

    java面试题大全.pdf

    1. **简单工厂与抽象工厂的区别** - **简单工厂模式**: 用于创建单个对象。 - **抽象工厂模式**: 用于创建一系列相关的或相互依赖的对象。 #### 八、Spring/Spring MVC 1. **为什么使用Spring** - **IoC ...

    [JAVA编程模式与范例].zip

    - 设计并实现一个简单的数据库连接池,应用单例模式和工厂模式。 - 使用Java实现网络聊天室,应用多线程和网络编程知识。 通过这个压缩包中的范例,你可以深入学习和实践这些Java编程模式,增强对Java语言和设计...

    quartz源码解析(一)

    - **工厂模式**:Quartz中Job和Trigger的创建主要通过SchedulerFactory和JobFactory,实现了对象的创建过程抽象化。 - **单例模式**:Scheduler通常是单例的,确保系统中只有一个调度器实例,减少资源消耗。 - **...

    简易计算器_C#写的代码比较复杂

    在C#编程中,创建一个简单的计算器其实可以非常简洁,但为了更好地体现面向对象的设计原则,程序员可能会将任务分解成多个类,使得代码结构更加清晰,易于维护和扩展。在这个"简易计算器_C#写的代码比较复杂"的例子...

    Spark学习笔记Spark Streaming的使用

    在 Spark Streaming 中,有一个最基本的抽象叫 DStream(代理),本质上就是一系列连续的 RDD,DStream 其实就是对 RDD 的封装。DStream 可以认为是一个 RDD 的工厂,该 DStream 里面生产都是相同业务逻辑的 RDD,只...

    超级有影响力霸气的Java面试题大全文档

    1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...

Global site tag (gtag.js) - Google Analytics