简单工厂模式作用:动态生成一类对象的实例。
工厂模式结构 :
下面是一个例子:发型有左偏分、右偏分,需要在程序中动态生成对应的实例。代码如下
/**
* 发型接口
*
*/
public interface IHair {
public void draw();
}
左、右偏分发型实现发型接口
/**
* 实现左偏分发型
*
*/
public class LeftHair implements IHair {
@Override
public void draw() {
System.out.println("左偏分发型");
}
}
public class RightHair implements IHair {
@Override
public void draw() {
System.out.println("右偏分发型");
}
}
实现发型的工厂,有三种方式,第一种不可取。
/**
* 实现发型工厂
*
*/
public class HairFactory {
/*根据字符串返回发型*/
public IHair getHair(String hair)
{
if("left".equals(hair)){
return new LeftHair();
}else if("right".equals(hair)){
return new RightHair();
}
return null;
}
/*根据类名返回对应类型*/
public IHair getHairByClass(String name)
{
try {
return (IHair) Class.forName(name).newInstance();
} catch (InstantiationException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return null;
}
/*根据类名缩写返回对应类型*/
public IHair getHairByKey(String key)
{
ProperReader proReader = new ProperReader();
try {
return (IHair)Class.forName(proReader.getFullName(key)).newInstance();
} catch (InstantiationException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return null;
}
}
主函数中调用工厂:
public static void main(String[] args) {
//根据字符串生成类
// HairFactory factory = new HairFactory();
// IHair hair = factory.getHair("left");
// hair.draw();
//根据类名Class反射
// HairFactory factory = new HairFactory();
// IHair left = factory.getHairByClass("tk.starxing.factory.LeftHair");
// left.draw();
//根据类名缩写
HairFactory factory = new HairFactory();
IHair right = factory.getHairByKey("right");
right.draw();
}