Java基础之工厂模式的思考

原创 2015年07月08日 12:01:56

工厂设计

首先,我们拿水果作为本次案例的一个讲解:

interface Fruits{
	public void eat();
};
class Apple implements Fruits{
	public void eat(){
		System.out.println("I want to eat Apple.....");
	}
};
class Oranger implements Fruits{
	public void eat(){
		System.out.println("I want to eat Oranger");
	}
};

And then ,我们编写一下客户端的代码:

public class Demo5Factory {
   public static void mian(String[] args){
	   Fruits f=new Apple();
	   f.eat();
           Fruit f2 =new Oranger();
           f2.eat();
   }
}

这样写,我们觉的合理吗?Why ?and How to do?

Why?

Analyse;

             首先,我们应该保证,客户端或者调用端的代码应该足够简洁,并且他的修改代价是最少的。客户端的代码修改起来是简单的灵活的。

             假设:如果我们的是分布式的应用,我们的客户端与程序是分割2地的,如果我们要修改后面的代码,我们也必须要修改客户端的代码。但为了避免客户端的代码改写,我们可以在后面做一些改写;

How?

resolution:

/**
 * 定义   工厂   方法;
 * @author R
 *
 */
class Factory{
	public static Fruits getInstance(String className){
		Fruits f=null;
		//注意这种写法是不可取的,应该采用这种写法 ” “。equals(className);这样可以避免抛出空指针,可悲我大3才发现并纠正这个不良的习惯啊;
//		if(className.equals("apple")){
//			f=new Apple();
//		}if(className.equals("Oranger")){
//			f=new Oranger();
//		}
		if("apple".equals(className)){
			f=new Apple();
		}if("Oranger".equals(className)){
			f=new Oranger();
		}
		return f;
	}
};

这样我们的客户端就可以这样写:

   public static void main(String[] args){

	   Fruits f1= Factory.getInstance("apple");
	   f1= Factory.getInstance(null);
	   
   }
这样写的好处,就是完全对Apple 进行了解耦,后端与前端代码完全隔离,如果要维护,我们也只需维护后端的代码即可。

用反射改进工厂模式

如果我们要添加一个新的类如  Watermelon 西瓜类 如我们就必须修改Factory 为了避免这样的事情发生,我们用反射对工厂进行以下修改:

class Factory{
	
	public static Fruit getInstance(String className){
		Fruit f=null;;
        try {
			f=(Fruit) Class.forName(className).newInstance();
		} catch (InstantiationException | IllegalAccessException
				| ClassNotFoundException e) {
			e.printStackTrace();
		}
		return f;
	}
}
我们调用是就如下实现:直接包路径+类名称

   public static void main(String[] args){
	   Fruit f=Factory.getInstance("demoFactory001.Oranger");
	   f.eat();
   }
综上:我们这样是得到了改进,单在使用类的时候,我们必须要知道并且输入一段很长的 字符路径 使用起来就非常不方便,因此,有人提出了一个这样的设计思路;

通过配置文件+Factory来实现这种设计 ,于是呼,Spring 的 IOC 就诞生了。

模仿Spring的IOC

添加配置文件:E:\\fruit.properties 
apple=demoFactory002.Apple
orange=demoFactory002.Orange


class Init{
	public static Properties getPro(){
		Properties pro = new Properties() ;
		File f = new File("E:\\fruit.properties") ;	// 找到属性文件
		try{
			if(f.exists()){	// 文件存在
				pro.load(new FileInputStream(f)) ;	// 读取属性
			}
//			else{
//				pro.setProperty("apple","demoFactory002.Apple") ;
//				pro.setProperty("orange","demoFactory002.Orange") ;
//				pro.store(new FileOutputStream(f),"FRUIT CLASS") ;
//			}
		}catch(Exception e){}
		return pro ;
	}
};
实现如下:
	public static void main(String args[]){
		Properties pro = Init.getPro() ;
		Fruit f = Factory.getInstance(pro.getProperty("apple")) ;
		if(f!=null){
			f.eat() ;
		}
	}



版权声明:转载注明出处

JAVA设计模式---工厂模式理解

前言多年的java经验,说句实话并没有刻意的去看设计模式相关的东西,但是设计模式相关的应用就在实际应用中,比如hibernate中connection的获取,根据不同的properties的配置内容,...
  • zhang6622056
  • zhang6622056
  • 2016年09月21日 14:48
  • 593

java工厂模式——Spring示例

package com.fsti.factory.factorybean; public interface Output { public final static Integer MAX...
  • huang_xw
  • huang_xw
  • 2012年06月16日 20:01
  • 4369

工厂模式及在项目中的应用

工厂模式分为简单工厂、工厂方法模式和抽象工厂模式。简单工厂顾名思义是最简单的,从一个工厂获取所需的产品类似于factory.getProduct1();或factory.getProduct2(),最...
  • empyan
  • empyan
  • 2017年02月06日 21:20
  • 2446

Java技术_每天掌握一种设计模式(003)_使用场景及简单实例(创建型:工厂方法)

模式描述 提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。 2.模式作用 可以一定程度上解耦,消费者和产品实现类隔离开...
  • ooppookid
  • ooppookid
  • 2015年01月13日 15:09
  • 3363

使用工厂设计模式的场景

使用工厂设计模式的场景 博客分类:  设计模式 使用工厂设计模式的场景  创建类对象虽然可以使用new(底层也是通过反射创建对象的),但是在一些情况下使用工厂模式确实最合适的。  情况一:如果...
  • zhangziwen94nb
  • zhangziwen94nb
  • 2015年03月04日 17:16
  • 4658

基于工厂模式的三层架构

需求:在程序代码不做任何改动的情况,只要配置不同的数据库如:ACCESS,MS SQL,ORACLE等,则程序一样能执行。1、建立IDAL类库项目,抽象数据访问接口。为每个表建立接口,规定各种操作(如...
  • aspnet2002web
  • aspnet2002web
  • 2010年11月10日 23:47
  • 3835

设计模式实战应用之五:工厂方法模式

工厂方法模式的应用相当广泛。工厂方法模式在 Java API 中的应用比比皆是:java.util.Collection 接口的 iterator 方法就是一个很著名的抽象工厂方法的示例;java.n...
  • defonds
  • defonds
  • 2014年07月30日 18:23
  • 4616

设计模式(一) 工厂模式 五种写法总结

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52703280本文出自:【张旭童的博客】系列开篇瞎BB设计模式相关的文章学习与总结,一...
  • zxt0601
  • zxt0601
  • 2016年10月12日 16:47
  • 13404

java中的工厂模式是什么,请举例说明

工厂模式就是在接口和子类之间加入了一个过渡端,通过此过渡端获得接口的实例化对象,这个过渡端也就是所谓的工厂类。这样以后如果再有程序子类要扩充,直接修改工厂类客户端就可以根据标记得到相应的实例,增加了程...
  • maguanghui_2012
  • maguanghui_2012
  • 2015年08月02日 22:11
  • 1370

Java设计模式菜鸟系列(四)工厂方法模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39760895 工厂方法模式(Factory Method)分为三种: 一、普通工厂模式。...
  • JAVE_LOVER
  • JAVE_LOVER
  • 2014年10月04日 22:29
  • 2594
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java基础之工厂模式的思考
举报原因:
原因补充:

(最多只允许输入30个字)