`
zhaohong
  • 浏览: 59363 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

工厂模式与单例模式

阅读更多

昨天晚上做了一个工厂模式的练习,通过XML配置把工厂要生成的具体类传给工厂,这样当有更多类实现接口时就只需要修改一下XML配置就可以了,省去了修改代码的麻烦。

睡觉时想了一点可以把工厂类要用的一些类设计为单例,那样可以效果更好一点。本人认为单例一般有三个步骤,具体的在代码中有详细说明,只是浅见,希望指教。

把代码贴出来一下,有什么地方可以改进的地方大家可以发表一下意见,共同提高。

car接口

package myFactoryDemo;

public interface car {

	void run();

	void stop();
}

 

smallcar 类

package myFactoryDemo;


public class smallcar implements car {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("smallcar is running ");

	}

	@Override
	public void stop() {
		System.out.println("smallcar is stopped ");

	}

}

 

bigcar 类

package myFactoryDemo;


public class bigcar implements car {

	@Override
	public void run() {
		// TODO Auto-generated method stub

		System.out.println("bigcar is running ");
	}

	@Override
	public void stop() {
		// TODO Auto-generated method stub
		System.out.println("bigcar is stopped ");

	}

}

 把实现了car接口的类都生成XML,放到XML文件中

package myFactoryDemo;


import java.io.* ;
import java.util.* ;
public class beforeFactory
{
	public static void main(String args[]) throws Exception
	{
		Properties p = new Properties() ;
		
		p.setProperty("s","myFactoryDemo.smallcar") ;
		p.setProperty("b","myFactoryDemo.bigcar") ;
		p.storeToXML(new FileOutputStream("zhw.xml"),"fhqxawfnh") ;
		p.loadFromXML(new FileInputStream("zhw.xml")) ;
		System.out.println(p) ;
	}
};

 

测试主类

package myFactoryDemo;

import java.util.Properties;


public class myFactory {
	public static void main(String args[]) {
		Properties p = new Properties();
		p = InitXML.getInstance().getPropertiesInit();
		System.out.println(p);

		// 加入一个可以从键盘输入数据的类
		System.out.print("输入要使用的子类代码:");
		String code = new InputData().getString();
		car f = Factory.getInstance().getFruitInstance(p.getProperty(code));
		if (f != null) {
			f.run();
			f.stop();
		} else {
			System.out.println("没有发现这个类型。");
		}
	}

}

 测试主类要用到几个工具类,以下列出,不再一一介绍。

package myFactoryDemo;

import java.io.FileInputStream;
import java.util.Properties;

public class InitXML {
	//单例模式第一步 把本类的构造函数设为私有
	private InitXML(){}
	//单例模式第二步  生成一个自身类类型的静态私有成员变量
	private static InitXML initxml = new InitXML();

	public Properties getPropertiesInit() {
		Properties p = new Properties();
		try {
			p.loadFromXML(new FileInputStream("zhw.xml"));
		} catch (Exception e) {
		}
		return p;
	}
//单例模式第三步  公共静态方法返回自身类型的静态变量
	public static InitXML getInstance() {
		return initxml;
	}

}

 

package myFactoryDemo;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class InputData {
	BufferedReader buf = null;

	public InputData() {
		buf = new BufferedReader(new InputStreamReader(System.in));
	}

	public String getString() {
		String str = null;
		try {
			str = buf.readLine();
		} catch (Exception e) {
		}
		return str;
	}

}

 

 

 

package myFactoryDemo;


public class Factory {
	
	private static Factory carfactory = new Factory();
	
	private Factory(){}
	
	public static Factory getInstance(){
		
		return carfactory;
		
	}
	public car getFruitInstance(String type) {
		car f = null;
		// 通过Class类完成
		try {
			f = (car) Class.forName(type).newInstance();
		} catch (Exception e) {
			System.out.println(e);
		}
		return f;
	}

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics