简单工厂 |
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(); //买五芳斋粽子------------------------输出结果 |
} |
} |
实现了一个工厂可以创建不同对象的功能 |
====================================================== |
如果要为特定的类创建代理对象,这就要用到代理模式。。。好难啊,动态代理???? |
====================================================== |
|
|
|
|
初级程序员
by: 赶蚊子 发表于:2017-06-20 11:02:38 顶(0) | 踩(0) 回复
受教了
回复评论