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中的简单工厂模式:1、女娲抟土造人 话说:“天地开辟,未有人民,女娲抟土为人。”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面。 女娲造...

【java基础补充】java接口、工厂模式和抽象类

接口 Interface        没有方法体,只有抽象方法, implements接口时候必须实现该接口所定义的所有的抽象方法        可以implements多个接口 用,号间隔...
  • actual_
  • actual_
  • 2011年12月29日 14:42
  • 512

java基础_设计模式_抽象工厂模式

1.工厂模式出现的原因,即有什么样的需求? 简单的举个例子:好多游戏都存在皮肤的概念,当你换皮肤的时候整个游戏的风格比如按钮、菜单、对话框等等 全部都替换了,再者,当新建一套新的皮肤的时候,要尽量做到...

工厂模式(Factory Pattern)和java反射机制优化思考

GOF的工厂模式是最基础的一种创建型设计模式,其适用于创建同一接口的不同实现子类, 其优点是:将使使用者更加方便使用,而不关心具体的创建逻辑 缺点是:每增加一个接口的子类,必须修改工程类的相关逻辑(后...

[好程序员训练营]-----java基础笔记之设计模式之单例模式和工厂模式

前两天刚了解java的设计模式,学习了几种常见的设计模式,,今天就简单的把我的做个总结吧! 废话不多说开始做笔记 一,什么是设计模式呢?使用设计模式有什么好处呢? 首先要说一下设计模式不是一种开发语言...

c++ java 抽象工厂模式代码

  • 2016年12月31日 19:20
  • 417KB
  • 下载

简单工厂模式的C++、Java实现

  • 2017年02月04日 18:05
  • 21.84MB
  • 下载

JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模式、工厂方法模式、单例设计模式之饿汉式和懒汉式、Runtime类

JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模式、工厂方法模式、单例设计模式之饿汉式和懒汉式、Runtime类 版权声明:转载必须注明本文转自程序员杜鹏程的博客:htt...
  • m366917
  • m366917
  • 2016年10月01日 16:19
  • 2053

Java工厂模式

  • 2014年12月24日 17:49
  • 11KB
  • 下载

java工厂模式

  • 2013年05月11日 14:02
  • 12KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java基础之工厂模式的思考
举报原因:
原因补充:

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