`
come_for_dream
  • 浏览: 120762 次
  • 性别: 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
分享到:
评论

相关推荐

    C++设计新思维:泛型编程与设计模式之应用(PDF)

    《C++设计新思维:泛型编程与设计模式之应用》正是这样一本书,它不仅深入探讨了C++的核心理念,还着重强调了泛型编程与设计模式的实际应用,为开发者提供了一个新的视角来审视和掌握这门语言。 泛型编程是C++设计...

    C++泛型编程和设计模式应用

    《C++泛型编程和设计模式应用》中可能涵盖了如工厂模式、单例模式、观察者模式等经典设计模式,并讨论了如何在C++中利用泛型编程来优化这些模式的实现。 书中的内容可能会包括以下几个方面: 1. 泛型编程基础:...

    C# 泛型,以及泛型接口的,简单的工厂模式,实现新闻阅览器

    工厂模式是一种设计模式,它提供了一种创建对象的最佳方式。在简单的工厂模式中,我们有一个工厂类,它负责根据输入的参数创建相应的对象。在我们的例子中,我们可以创建一个`NewsFactory`类,该类有方法如`...

    C++设计新思维:泛型编程与设计模式之应用

    《C++设计新思维:泛型编程与设计模式之应用》这本书深入探讨了C++语言在泛型编程和设计模式中的应用,对于理解和提升C++编程能力有着重要的指导价值。以下将围绕这些主题展开详细讨论。 一、泛型编程 泛型编程是...

    Cpp设计新思维_泛型编程与设计模式之应用

    《Cpp设计新思维_泛型编程与设计模式之应用》这本书深入探讨了C++编程中的泛型编程和设计模式的应用,对于提升C++开发者的技术水平具有极高的价值。以下是本书涉及的一些关键知识点: 1. 泛型编程:泛型编程是C++中...

    数据工厂泛型类

    总的来说,数据工厂泛型类提供了一种强大且灵活的方式来处理不同类型的数据库,它降低了代码重复,提高了代码的可读性和可维护性,并使得跨数据库操作变得更加简单。理解和利用好这类工具,对于提升数据处理项目的...

    数据工厂泛型类源码

    数据工厂模式是一种创建型设计模式,它的主要目的是通过提供一个工厂对象来创建其他对象,而不是直接实例化。这样做的好处是可以在不暴露创建逻辑的情况下,使客户端能够通过工厂方法获取所需的对象。数据工厂模式...

    21-04-03_FactoryPattern(001_在工厂模式下以通过接口结合列表、泛型和反射等方式实现指定类型的实例化操作_控制台).rar

    在软件设计模式中,工厂模式是一种非常常见的创建型模式,它的主要目的是为了隔离对象的创建过程,使得客户端代码不直接依赖具体的实现类,而是通过一个公共的接口或者抽象类来获取对象。在这个“21-04-03_...

    C++ 设计新思维:泛型编程与设计模式之应用

    《C++ 设计新思维:泛型编程与设计模式之应用》是一本深入探讨C++编程技术的著作,由侯捷老师倾力推荐并翻译。这本书的核心内容是将泛型编程与设计模式相结合,旨在提升代码的重用性和灵活性,为软件开发带来更高的...

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

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

    抽象工厂 SQL 和Access 利用泛型读取表中数据 WCF发布出去

    抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建相关或依赖对象的家族,而无需指定具体类。在这个场景中,"抽象工厂 SQL 和 Access" 指的是利用抽象工厂模式来创建与SQL Server和Microsoft Access...

    基于C++1x新标准实现泛型抽象工厂测试实例

    在C++编程中,抽象工厂模式是一种设计模式,它提供了一种创建对象家族的方法,而无需指定它们的具体类。在C++1x(通常指C++11、C++14、C++17标准)引入了新的特性,使得实现泛型抽象工厂更加灵活和高效。本测试实例...

    JAVA设计模式--程序设计--反射--注解--泛型

    Java设计模式、程序设计、反射、注解和泛型是Java开发中的核心概念,它们各自在不同的场景下发挥着重要作用,构建出高效、可维护的软件系统。 首先,Java设计模式是面向对象编程中的一种最佳实践,是解决常见问题的...

    Java 泛型擦除后的三种补救方法

    为了解决这个问题,我们可以采用三种设计模式:简单工厂、工厂方法和模板方法。 1. **简单工厂**: 简单工厂模式通过一个静态方法返回一个具体类型的实例。这种方法的优点是简洁,可以直接使用泛型方法。但是,它...

    自己整理好的go语言设计模式

    根据给定文件的内容,我们可以整理出Go语言实现的两种设计模式:简单工厂模式和策略模式。下面将详细说明这两种模式在Go语言中的实现方式和应用场景。 ### 简单工厂模式 简单工厂模式是一种创建型设计模式,它提供...

    设计模式-简单工厂模式-披萨店C#语言版

    标签中的“创意”和“最新”可能意味着这个示例展示了如何将经典的设计模式应用到现代编程实践,或者使用了C#的一些新特性,例如接口默认实现或泛型等,使得代码更加简洁和灵活。 压缩包中的`setup.exe`和`Pizza....

    Java设计模式,如工厂模式

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

Global site tag (gtag.js) - Google Analytics