`
从此醉
  • 浏览: 1051528 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

设计模式——简单工厂

 
阅读更多

第一个小例子:

public class Apple {
	/*
	 * 采集
	 */
	public void get(){
		System.out.println("采集苹果");
	}
}

public class Banana {
	/*
	 * 采集
	 */
	public void get(){
		System.out.println("采集香蕉");
	}
}

public class MainClass {
	
	public static void main(String[] args) {
		/*
		 * 实例化一个Apple
		 */
		Apple apple = new Apple();
		/*
		 * 实例化一个Banana
		 */
		Banana banana = new Banana();
		
		apple.get();
		banana.get();
	}	
}

运行结果:

采集苹果
采集香蕉

Apple和Banana都是水果,都有”采集“这个方法,所以这个采集方法可以抽象出来。

再写一个Fruit接口

public interface Fruit {

	/*
	 * 采集
	 */
	public void get();
}



现在Apple和Banana实例化Fruit

public class Apple implements Fruit{
	/*
	 * 采集
	 */
	public void get(){
		System.out.println("采集苹果");
	}
}

public class Banana implements Fruit{
	/*
	 * 采集
	 */
	public void get(){
		System.out.println("采集香蕉");
	}
}
现在可以通过多态(面向对象的特征之一)实例化

public class MainClass {
	
	public static void main(String[] args) {
		/*
		 * 实例化一个Apple
		 */
		Fruit apple = new Apple();
		/*
		 * 实例化一个Banana
		 */
		Fruit banana = new Banana();
		
		apple.get();
		banana.get();
	}	
}

现在我们来创建一个工厂,来专门实例化Fruit的实现。

public class FruitFactory {

	/**
	 * 获得Apple实例
	 */
	public Fruit getApple(){
		return new Apple();
	}
	/**
	 * 获得Banana实例
	 */
	public Fruit getBanana(){
		return new Banana();
	}
}

现在我们可以通过FruitFactory工厂实例化

public class MainClass {
	
	public static void main(String[] args) {
		//创建工厂
		FruitFactory factory = new FruitFactory();
		//得到Apple实例
		Fruit apple = factory.getApple();
		//得到Banana实例
		Fruit banana = factory.getBanana();
		//采集
		apple.get();
		banana.get();
	}	
}
由于FruitFactory只是一个工具类,并不需要什么属性,所以我们可以将它的方法静态化。

public class FruitFactory {

	/**
	 * 获得Apple实例
	 */
	public static Fruit getApple(){
		return new Apple();
	}
	/**
	 * 获得Banana实例
	 */
	public static Fruit getBanana(){
		return new Banana();
	}
}

所以实例可以这样得到

public class MainClass {
	
	public static void main(String[] args) {
		//得到Apple实例
		Fruit apple = FruitFactory.getApple();
		//得到Banana实例
		Fruit banana = FruitFactory.getBanana();
		//采集
		apple.get();
		banana.get();
	}	
}


可以看出简单工厂模式中主要有三个角色:

工厂角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外部直接调用,创建所需的产品对象。

抽象角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品角色:简单工厂模式所创建的具体实例对象。


下面我们来讲该工厂方法改进一下

public class FruitFactory {
	
	/**
	 * get方法,获得所有产品对象
	 * @throws IllegalAccessException 
	 * @throws Exception 
	 */
	public static Fruit getFruit(String type) throws Exception{
		if(type.equalsIgnoreCase("apple")){
			return (Fruit)Apple.class.newInstance();
		}else if(type.equalsIgnoreCase("banana")){
			return (Fruit)Banana.class.newInstance();
		}else{
			System.out.println("找不到相应的类");
			return null;
		}
	}
}

public class MainClass {
	
	public static void main(String[] args) throws Exception {
		//得到Apple实例
		Fruit apple = FruitFactory.getFruit("apple");
		//得到Banana实例
		Fruit banana = FruitFactory.getFruit("banana");
		//采集
		apple.get();
		banana.get();
	}	
}

还可以再改进

public class FruitFactory {
	
	/**
	 * get方法,获得所有产品对象
	 * @throws IllegalAccessException 
	 * @throws Exception 
	 */
	public static Fruit getFruit(String type) throws Exception{
		return (Fruit)Class.forName(type).newInstance();
	}
}

public class MainClass {
	
	public static void main(String[] args) throws Exception {
		//得到Apple实例
		Fruit apple = FruitFactory.getFruit("Apple");
		//得到Banana实例
		Fruit banana = FruitFactory.getFruit("Banana");
		//采集
		apple.get();
		banana.get();
	}	
}


虽然对上面的有所改进,但还是缺乏灵活性,因为还需要指定类名,可以通过配置文件配置然后读取。

下面我们将.java文件先放到com.meritit包下,并建立一个fruit.properties文件和ConfigUtil.java工具类。


fruit.properties文件内容如下:

apple = com.meritit.Apple
banana = com.meritit.Banana

ConfigUtil是读取配置文件的一个工具类:

package com.meritit;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ConfigUtil {
	/**
	 * 
	 * @param key
	 * @return value
	 */
	public static String getConfig(String style){
		Properties pro = new Properties();
		InputStream inStream = ConfigUtil.class.getClassLoader()
				.getResourceAsStream("fruit.properties");
		try {
			pro.load(inStream);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return pro.getProperty(style);
	}
}

现在工厂方法可以写成这样:

package com.meritit;

public class FruitFactory {
	
	/**
	 * get方法,获得所有产品对象
	 * @throws IllegalAccessException 
	 * @throws Exception 
	 */
	public static Fruit getFruit(String type) throws Exception{
		String fruittype = ConfigUtil.getConfig(type);
		return (Fruit)Class.forName(fruittype).newInstance();
	}
}

获得实例:

package com.meritit;

public class MainClass {
	
	public static void main(String[] args) throws Exception {
		//得到Apple实例
		Fruit apple = FruitFactory.getFruit("apple");
		//得到Banana实例
		Fruit banana = FruitFactory.getFruit("banana");
		//采集
		apple.get();
		banana.get();
	}	
}

在这个模式中,工厂类是整个模式的关键。它包含必要的判断逻辑,能够根据外界给定的信息知道创建那个类的实例,外部无需了解该对象是如何被创建和组织的。有利于软件体系结构化。

但是不难发现,简单工厂模式的缺点也体现在工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中具体产品不断增多时,可能会出现要求工厂类也要做出相应的修改,扩展性并不好。

举一个应用的例子:

源代码下载:http://download.csdn.net/detail/lxq_xsyu/5903699




分享到:
评论

相关推荐

    设计模式——简单工厂模式

    这个是http://blog.csdn.net/dawanganban/article/details/9875873博客中java设计模式的源代码。下载前请先看《设计模式——简单工厂》一文。

    实验二 简单工厂模式.zip_31QS_C#_设计模式——简单工厂模式_设计模式实验

    经典的设计模式————简单工厂模式,里面有实验文档和实验源代码还有课件助于你的学习

    设计模式——简单工厂 VS 工厂方法

    NULL 博文链接:https://maidoudao.iteye.com/blog/1328618

    设计模式C#描述之——简单工厂模式

    设计模式C#描述之——简单工厂模式,让你学习C#的一种设计模式

    设计模式——工厂模式在开发中的应用(简单计算器)

    这个是http://blog.csdn.net/dawanganban/article/details/9884681博客中java设计模式的源代码。下载前请先看《设计模式——工厂模式在开发中的应用》一文。

    Python设计模式之简单工厂模式实例详解

    本文实例讲述了Python设计模式之简单工厂模式。分享给大家供大家参考,具体如下: 简单工厂模式(Simple Factory Pattern):是通过专门定义一个类...设计模式——简单工厂模式 简单工厂模式(Simple Factory Pattern):是通

    Java设计模式——工厂设计模式

    简单工厂模式 工厂方法模式 抽象工厂模式 面向对象设计的基本原则: OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。 DIP(依赖倒转原则,Dependence Inversion Principle):...

    C#设计模式(3)——工厂方法模式.pdf

    此 时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许 系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中缺点。下面看下工厂模式 的具体实现...

    简单工厂模式

    设计模式课程资料——简单工厂模式,使用Java实现,在eclipse进行编译

    (创建模式 上)设计模式——工厂、抽象工厂 C++/Python3实现

    设计模式是为了解决一些出现的问题设计的解决方案。是长时间经验的总结,是根据不同问题从而提出并且实践出来的解决办法。使用不同的设计模式可以解决不同的问题。 设计模式可以分为三种大类别:分别是创建型模式、...

    应用了设计模式之简单工厂模式的计算器

    完成了,但感觉这也没啥特别的,程序界面黑布隆冬的,内部结构也是最最平常的面向对象,于是我应用了《大话设计模式》这本书中的第一个模式——简单工厂模式,看上去还不错。界面的话,也就是输出的语句变了,system...

    C++设计模式之工厂方法模式

    之前讲到了C++设计模式——简单工厂模式,由于简单工厂模式的局限性,比如:工厂现在能生产ProductA、ProductB和ProductC三种产品了,此时,需要增加生产ProductD产品;那么,首先是不是需要在产品枚举类型中添加新...

    C#工厂设计模式简单实例

    C#工厂设计模式简单实例——计算器 public class Factory { //创建一个静态方法 public static Operation CreateOper(int a, int b, string oper) { //创建一个Operation对象 Operation op = null; switch ...

    Java设计模式:工厂模式——图文+代码示例(通俗易懂)

    先来看看,简单工厂模式——也叫静态工厂模式,这里举个例子:你要去买一台手机,你不用关心手机是怎么生产出来的,里面的零件具体又是怎么制造的,这些通通都交给工厂去处理,你尽管去买手机就好了。 简单工厂模式...

    Java设计模式 版本2

    Java设计模式,目录:前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一...

    C++设计模式原理与实战视频课

    C++设计模式原理与实战视频课 1-1 课程介绍 1-2 导论UML和设计模式导论 2-1 简单工厂方法的定义场景与实现-针对接口编程的设计思想剖析 2-2 简单工厂实用工程技术:C++对象动态创建技术与配置化开发 2-3 单例模式的...

    深入浅出设计模式(中文版)

    1.1什么是设计模式 2 1.2设计模式的作用 3 1.3GRASP模式的分类 4 1.4GoF设计模式的分类 4 1.5模式的学习阶段 6 第2章负责任地设计对象——GRASP 9 2.1InformationExpert(信息专家) 11 2.2Creator(创造者)...

    深入浅出设计模式(中文版电子版)

    1.1什么是设计模式 2 1.2设计模式的作用 3 1.3GRASP模式的分类 4 1.4GoF设计模式的分类 4 1.5模式的学习阶段 6 第2章负责任地设计对象——GRASP 9 2.1InformationExpert(信息专家) 11 2.2Creator(创造者)...

    CreateCar(简单工厂模式)

    设计模式入门1——简单工厂模式(AudiFactory) http://blog.csdn.net/lynch0571/article/details/22925771

    Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计...设计模式——工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延时到其子类. 工厂方法模式克服了简单工

Global site tag (gtag.js) - Google Analytics