用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

工厂模式----一个工厂vs多个模型对象

2017-06-16 作者:逻辑与思维举报

[java]代码库

简单工厂

1.创建一个子弹类Bullet和士兵类Soldier
public class Bullet{}
public class Soldier{}

2.一个生产子弹(bullet)的工厂
public class BulletFactory {
	//单例
	private static BulletFactory factory=new BulletFactory();
	//私有化构造函数
	private BulletFactory(){}
	//定义一个对外开放的方法,以获取该工厂实例
	public static BulletFactory getFactory(){
		return factory;
	}
	//创建子弹对象
	public Bullet newInstance(){
		try {
			//获取bullet类的全名(包含包名model.Bullet)
			String className="factory.Bullet";
			//获取该类的字节码对象
			Class clz=Class.forName(className);
			//创建子弹类的实例并返回
			return (Bullet) clz.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}

3.创建一个生产士兵的工厂
public class SoldierFactory {
	//单例
	private static SoldierFactory factory=new SoldierFactory();
	//私有化构造函数
	private SoldierFactory(){}
	//定义一个对外开放的方法,以获取该工厂实例
	public static SoldierFactory getFactory(){
		return factory;
	}
	//创建子弹对象
	public Soldier newInstance(){
		try {
			//获取bullet类的全名(包含包名factory.Bullet)
			String className="model.Soldier";
			//获取该类的字节码对象
			Class clz=Class.forName(className);
			//创建子弹类的实例并返回
			return (Soldier) clz.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}

4.如果要为每一个类都创建一个工厂,当要创建实例的类很多的时候,要创建的工厂也就多了,这时要想办法使用一个工厂(BasicFactory)就能够创建各种各样的对象(既能创造子弹、士兵、还能创造人民币、美元、汽车等不同的对象)-------使用泛型
    
这时我们把要创建实例的对象都放到一个配置文件中,如果要创建该类的实例,就修改配置文件就可以了
conf.properties信息(properties类来读取)
#className=model.Bullet
className=model.Soldier
 通过读取配置文件,来获取要创建实例的类的名称
=========================================================
5 PropUtils工具类--读取配置文件
package model;
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;

public class PropUtils {
	private static Properties prop = new Properties();
	static{
		try {
			//通过类加载器读取配置文件的路径
			String path = PropUtils.class.getClassLoader().getResource("conf.properties").getPath();
			prop.load(new FileInputStream(new File(path)));		
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}	
	/**
	 * 根据key获取配置文件中的value
	 * @param string key
	 * @return string value
	 */
	public static String getProp(String key) {
		return prop.getProperty(key);
	}	
}

6.创建一个工厂(BasicFactory)

public class BasicFactory {
	private static Properties prop = new Properties();
	//单例
	private static BasicFactory factory=new BasicFactory();
	//私有化构造函数
	private BasicFactory(){}
	//定义一个对外开放的方法,以获取该工厂实例
	public static BasicFactory getFactory(){
		return factory;
	}
	//创建子弹对象
	@SuppressWarnings("unchecked")
	public <T>T newInstance(){
		try {
			//获取类的全称(key : className ; value : 类名)
			String className=prop.getProperty("className");
			//获取该类的字节码对象
			Class clz=Class.forName(className);
			//创建实例并返回
			return (T) clz.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}
========================================================================
7.如果  想要调用接口中的方法,那我们首先要创建接口实现类的对象,当需要创建多个实现类的对象时,配置文件conf.properties:
# 例如顶一个三个接口  Person    Car     Money
#  Person有两个实现类 Student 和Teacher
#  Car有1个实现类  CarImpl
#  Money有2个实现类  Rmb   Dollar
#  可以将接口名称作为key键,对应的接口实现类作为value值
  Person=model.person.Student
  #Person=model.person.Teacher
  Car=model.car.CarImpl
  #Money=model.money.Dollar
  Money=model.money.Rmb
==========================================
8.接口和实现类
8-1 Person
package model.person;
public interface Person {
    public void work();
}
public class Student implements Person {
    public void work() {
		System.out.println("学习java");
	}
}
public class Teacher implements Person {
	public void work() {
		System.out.println("教你Java编程思想");
	}
}
8-2 Car
package model.car;
public interface Car {
    public void driver();
}
public class CarImpl implements Car {
	@Override
	public void driver() {
		System.out.println("老司机要上车了,带你们");
	}
}
8-3 Money
package model.money;
public interface Money {
	public void buy();
}
public class Rmb implements Money {
	@Override
	public void buy() {
		System.out.println("买五芳斋粽子");
	}
}
public class Dollar implements Money {
	@Override
	public void buy() {
		System.out.println("只能买汉堡");
	}
}
==================================
9.  BasicFactory的newInstance()方法
	public <T>T newInstance(Class<T> clazz){
		try {
			//获取类的全称(key : 接口名 ; value : 实现类类名)
			String className=prop.getProperty(clazz.getSimpleName());
			//获取该类的字节码对象
			Class clz=Class.forName(className);
			//创建实例并返回
			return (T) clz.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}
==================================
10.测试类 Test.java
package model;
import factory.BasicFactory;
import model.car.Car;
import model.money.Money;
import model.person.Person;
public class Test {
	public static void main(String[] args) {
		Person p=BasicFactory.getFactory().newInstance(Person.class);
		Car car=BasicFactory.getFactory().newInstance(Car.class);
		Money money=BasicFactory.getFactory().newInstance(Money.class);
		p.work();  //    学习java------------------------------输出结果
		car.driver(); //老司机要上车了,带你们--------------输出结果
		money.buy(); //买五芳斋粽子------------------------输出结果
	}
}
   实现了一个工厂可以创建不同对象的功能
======================================================
  如果要为特定的类创建代理对象,这就要用到代理模式。。。好难啊,动态代理????
======================================================


    



 

       
       


分享到:
更多

网友评论    (发表评论)

共2 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。