工厂模式是我们很常用的模式了,著名的spring框架就使用了工厂模式。
为什么说工厂模式是最常用的,因为工厂模式就相当于创建对象的new。工厂模式就是用来创建对象的
在PatternsInJava
书中把工厂模式主要分为:工厂方法与抽象工厂,当然这本书在举例的时候用比较简单的实例,让你来明白工厂模式具体来做什么,但是在实际应用中往往要复杂的多,比如spring框架在运用工厂模式的时候,但归根结底工厂模式主要是用来给我们的程序进行解耦,替我们去创建我们所需的对象。
工厂方法一般用于简单的对象创建,下面简单的举一个工厂方法的代码实例
所需的类
package com.dongzhu.cn.factory;
import com.dongzhu.cn.bean.HisSample;
import com.dongzhu.cn.bean.MySample;
import com.dongzhu.cn.port.Sample;
// 工厂方法类
public class Factory {
public static Sample creator(int which){
// ....
if(which == 1){
return new MySample();
}else if(which == 2) {
return new HisSample();
}
return null;
}
}
// 主启动类
public class MainClass {
public static void main(String[] args) {
Sample sample = Factory.creator(1);
}
}
其实在我们看来这样子做,基本上没什么用因为它还是强耦合的,但是却直观的帮我们重现工厂所帮
我们做的是,那就是创建对象,并且封装了创建实例的代码,以上是工厂方法的举例。
抽象工厂
public abstract class AbstractClass {
public abstract Sample creator();
public abstract Sample2 Creator2();
}
抽象工厂具体实现
工厂具体实现
public class Factory extends AbstractClass {
@Override
public Sample creator() {
return null;
}
@Override
public Sample2 Creator2() {
return null;
}
}
public class Factory {
private static HashMap cacheMap = new HashMap();
static {
try {
Properties properties = new Properties();
InputStream inputStream = new FileInputStream("resource/application.properties");
properties.load(inputStream);
Enumeration enumeration = properties.propertyNames();
while (enumeration.hasMoreElements()) {
String className = (String) enumeration.nextElement();
String classPath = properties.getProperty(className);
Class temp = Class.forName(classPath);
Object object = temp.newInstance();
cacheMap.put(className, object);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static T getInstance(String name) {
return (T)cacheMap.get(name);
}
}
public class MainClass {
public static void main(String[] args) {
HisSample hisSample = Factory.getInstance("hisSample");
System.out.println(hisSample);
}
}
声明:本章参考了patternInJava 书籍