不管是什么东西,无论其实践性有多强,一旦变成了理论,就会变得很抽象,很难抓住其核心.
工厂模式这个东西怎样理解呢?
我们平常在日常生活中,要用到洗发水,牙膏等,我们怎样得到这些东西呢?当然我们不会自己去生产洗发水,牙膏这些东西,而是生产洗发水,牙膏的工厂向我们进行提供.这就是我们实际生活当中的工厂模式.
对比到编程中来,工厂模式就是用来创建实例对象的。实例对象就好比是洗发水,牙膏这些日常用品,通过工厂产生出来,供我们使用.以前我们自己new对象,现在我们向工厂要对象。再说得直白点,所谓的工厂就相当于创建实例对象的关键字new,我们把这种通过工厂创建实例对象的方式就称为工厂模式. (纯属个人理解,当不得真的)
什么是简单工厂模式?
就是通过一个类(相当于工厂)来创建其它类的实例
简单示例:
class Simple{
}
通过new关键字创建实例对象:
Simple simple = new Simple();
现在不想通过new关键字来创建实例, 创建产生Simple实例对象的工厂类:
class SimpleFactory{
public static Simple getSimpleInstance(){
return new Simple();
}
}
通过工厂产生Simple实例对象:
Simple simple = SimpleFactory.getSimpleInstance();
现在加深一点,如果Simple是其它类的父类或者父接口,再加上反射,就可以很好的实现其功能的拓展性:它能够在不改动代码的情况下,产生子类的实例对象:如下所示:
interface Simple{
}
class SimpleFactory{
public static Simple getSimpleInstance(String name){//将子类的名字传递进来
try{
return (Simple)Class.forName(name).newInstance();
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
再加深一点,如果利用配置文件,就可以自由的进行类与类之间的切换,真正做到不对源代码进行修改:
class SimpleFactory{
private static String className;
static{
try{ //进行配置文件的加载
InputStream inStream = new FileInputStream("config.properties");
Properties pros = new Properties();
pros.load(inStream);
className = pros.getProperty("className");
inStream.close();
}catch(Exception e){
throw new ExceptionInInitializerError(e);
}
}
public static Simple getSimpleInstance( ){
try{
return (Simple)Class.forName(className).newInstance();//利用反射得到子类的实例对象
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
配置文件写法如下:(config.properties)
className=包名.SimpleImpl (注意:这里要写类的全名)
总结:以上就是关于简单工厂模式的介绍。 工厂模式一般是和单例模式结合起来使用,即将工厂设置成为单例即可,这里只要将单例的设计步骤加进去就行了.