`
come_for_dream
  • 浏览: 116808 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

设计模式之从简单工厂到泛型简单工厂

阅读更多

设计模式之简单工厂模式到泛型工厂

         简单工厂模式(Simple Factory Pattern)又称为虽然23种设计模式中并不包含简单工厂模式,但是它是一种创建性模式应用的也相对比较广泛。在简单工厂模式中,可以根据参数的不同返回不同类的实例,被创建的实例通常都有相同的父类。

        以下是该模式的模式结构图:

        首先我们称创建的实例为产品

         简单工厂模式的有以下几个特点:

         Factory:工厂角色

         Fruit:抽象产品类

         Apple:具体产品类

         Banana:具体产品类

在客户类中我们可以

Fruit fruit=Factory.getInstance("Apple");

 当然我们也可以使用dom技术在xml中指定类名。

可见使用简单工厂模式有很多的优点:

1、将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。
2、在调用工厂类的工厂方法时,由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数即可,在实际开发中,还可以在调用时将所传入的参数保存在XML等格式的配置文件中,修改参数时无须修改任何Java源代码。

 

 

但是这个模式也有一个很大的缺点:

下面我们来分析一下这个模式的代码和可维护性等等。

if(type.equals("Apple")){

  new Apple();

}else if(type.equals("Banana")){
 
  new Banana();

}

 上面这个代码有一个很明显的问题:

1、假如我要在系统中添加一种水果类要怎么办?

2、若系统中的水果类有几十种的话,上面这段代码将变得异常臃肿,维护起来相当麻烦。

3、工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。

 

那么针对这个问题我想可不可以利用以前学过的泛型知识来解决这个问题




 
 客户端代码:

GenericFactory factory = new GenericFactory<Fruit>();
Fruit fruit = factory.getInstance(Apple.class);
fruit.eat();

 这样我们再添加一个水果类,不需要修改GenericFactory的getInsance方法,很好的实现了开闭原则。甚至我们可以在客户端使用dom解析技术对XML文件进行解析:

 下面是完整的代码:

public class GenericFactory<T extends Fruit> {

	public T getInstance(Class<T> genericCla) {
		T fruit = null;
		try {
			fruit = genericCla.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return fruit;
	}

	public static void main(String[] args) throws ClassNotFoundException {
		GenericFactory factory = new GenericFactory<Fruit>();
		String className=DomUtil.getClassPath();
		Class class1=Class.forName(className);
		Fruit fruit = factory.getInstance(class1);
		fruit.eat();
	}
}

 

 

我们只需要在config.xml指定要使用的具体水果类即可:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean>
		<className>com.zdx.design.patterns.genericFactory.Banana</className>
	</bean>
</beans>

 

 具体的DomUtil工具

 

package com.zdx.design.util;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DomUtil {

	public static String getClassPath() {
		String classPath=null;
		try {
			DocumentBuilderFactory builderFactory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder documentBuilder = builderFactory
					.newDocumentBuilder();
			Document document = documentBuilder.parse(new File("bin/config.xml"));
			Element root=document.getDocumentElement();
			NodeList beans = root.getChildNodes();
			
			for (int i = 0; i < beans.getLength(); i++) {
				Node nodeClass=beans.item(i);
				 if(nodeClass.getNodeType()==Node.ELEMENT_NODE){
					 for(Node node=nodeClass.getFirstChild();node!=null;node=node.getNextSibling()){
						 if(node.getNodeType()==Node.ELEMENT_NODE){
							 if(node.getNodeName().equals("className")){
									 classPath= node.getFirstChild().getNodeValue();
							 }
						 }
					 }
					 
					
				 }
			}
		
		} catch (Exception e) {
			e.printStackTrace();
		}

		return classPath;
	}

}

 

 

以上两种模式都是简单工厂模式,只是实现的方式不一样第二种是用反射的方式代替了第一种方法创建产品对象的逻辑判断,第二种使系统更加灵活,扩充性更好,当新增一种水果类的时候并不需要对现有系统的代码进行修改很好的实现了开闭原则。

 

  • 大小: 106.4 KB
  • 大小: 182.4 KB
  • 大小: 233.3 KB
  • Pattern.zip (11.3 KB)
  • 描述: 源代码
  • 下载次数: 3
分享到:
评论

相关推荐

    【资源免费下载】Java代码积累丨大话设计模式(Java实现版本)、线程协作

    工厂简单模式 创造型模式 工厂方法模式 抽象工厂模式 原型模式 建造者模式 单例模式 结构型模式 队列模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 行为模式(类行为模式) 解释器模式 模板方法模式 ...

    Java设计模式,如工厂模式

    描述Java的各种设计模式,例如工厂模式,泛型模式,迭代器模式等

    ASP.NET通过反射获取泛型列表

    本示例展示了使用工厂方法设计模式,利用反射,通过泛型接口获取具体类型的列表。比如,要返回一张表的数据,通常使用List&lt;具体表名&gt;,本示例源码展示了通过类型参数传递表名,使用List的形式返回具体的表数据

    领域驱动设计与模式实战

    2.4 针对具体应用程序类型的设计模式 2.5 领域模式 2.6 小结 第3章 TDD与重构 3.1 TDD 3.1.1 TDD流程 3.1.2 演示 3.1.3 设计效果 3.1.4 问题 3.1.5 下一个阶段 3.2 模拟和桩 3.2.1 典型单元测试 3.2.2 声明独立性 ...

    《构建高质量的C#代码》.(曹化宇).pdf

    《构建高质量的c#代码》主要内容包括c#的基本语法、结构与应用特点,常用开发资源与技术要点,设计模式在c#中的应用等,以及特别重要的一点,即我们应该养成良好的开发习惯,不仅要注重技术细节,还要从更宽阔的视野...

    java高级特性,涵盖了多种java常用的一些例子

    设计模式1(单例,工厂) 设计模式2(观察者,适配器) 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,是解决特定问题的一系列...

    Java初级开发面试题

    Java面试题包括但不限于: Java基础知识:语法、面向对象编程、...Java设计模式:单例模式、工厂模式、代理模式等。 网络编程:TCP/IP、HTTP、Web Services等。 数据库相关:SQL语句、数据库连接池、事务管理等。

    Java电子书打包-6

    Java设计模式之抽象工厂模式.pdf Java数据结构和算法.pdf Java数据结构和算法中文第二版.pdf Java线程.pdf Java夜未眠_程序员的心声.pdf JAVA优化编程.pdf Java语言编码规范.PDF Java语言程序设计-基础篇(原书第8版)...

    asp.net知识库

    SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL-DMO实现定制SQL Scripts Create Tables and Build inserts from Tables by using Mygeneration Templates(Sql Server) C# 获取...

    基于Android的MVP模型良好的架构设计模板

    这是一个Android MVP模型良好的架构设计,同时也做了Android和HTML 5交互架构,用到了RxJava+Retrofit+MVP+泛型缩减mvp+模板模式+命令模式+观察者模式+管理者模式 +简单工厂模式

    cs_basic_concept

    程序语言:hash 表原理java 对象的堆栈模型java jvm 死锁研究java 不同 list 的对比java gc 回收研究java 不同Map 的对比java 设计模式之工厂模式java 概念之泛型java 和 python 的对象模型对比java 的线程安全java ...

    Java基础知识点总结.docx

    二十一、 设计模式★★★★★ 136 设计模式简介 136 单例设计模式:★★★★★ 156 工厂模式★★★★★ 159 抽象工厂模式★★★★★ 163 建造者模式 170 原型模式 177 适配器模式 182 桥接模式 188 过滤器模式 192 ...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    设计模式 结构模式 适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 创建模式 抽象工厂模式 工厂方法模式 建造这模式 原型模式 单例模式 行为模式 责任链模式 命令模式 解释...

    ATM java实现

    atm机java实现,练习了面向对象思想,多态的应用,工厂模式的应用,简单易懂。支持多人操作。可以很好的练习集合的使用,并设计到了泛型。

    积分管理系统java源码-knowledge:这是我的知识,包括我所有已知的

    常用设计模式 模板模式 单例模式 & 多例模式 代理模式 策略模式 原型模式 工厂模式 委托 其他 Spring5 IOC容器设计原理及高级特性 AOP设计原理 FactoryBean和BeanFactory Spring事务处理机制 Spring JDBC Spring MVC...

    北京百度java面试题大全

    Java面试题是针对Java编程语言的技术和知识的一系列问题,用于考察面试者在Java开发方面的能力和...设计模式:涉及常见的设计模式,如单例模式、工厂模式、观察者模式等。 Java框架和技术:包括Spring、Hibernate、My

    Codematic.Net代码自动生成器

    Codematic 是一款为C#数据库程序员设计的自动代码生成器,Codematic 生成的代码基于基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。采用 Model + ...

    影院售票管理系统(1.0)

    使用简单工厂模式创建不同类型的电影票 使用多态实现不同类型电影票的价格计算 使用接口实现电影票的打印 使用序列化和反序列化实现销售情况的保存和读取 联系方式:15001066698 电子邮件:police737@sina.com

Global site tag (gtag.js) - Google Analytics