java设计模式之工厂模式例子详解
HairFactory类
package com.kero99.ygc.project;
public class HairFactory {
/**
* 设计模式(Design Pattern)
* 是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
* 工厂模式概念:
* 实例化对象,用工厂方法代替new操作。
* 工厂模式包括工厂方法模式和抽象工厂模式。
* 抽象工厂模式是工厂方法模式的扩展。
* 工厂模式的意图:
* 定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。
* 工厂方法把实例化的工作推迟到子类中去实现。
* 工厂模式使用场景:
* 有一组类似的对象需要创建。
* 在编码时不能预见需要创建那种类的实例。
* 系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节。
* eg:场景脸萌↓
* @param key
* @return
*/
public HairInterface getHair(String key){
if("left".equals(key)){
return new LeftHair();
}else
if("right".equals(key)){
return new RightHair();
}
return null;
}
//反射实现
public HairInterface getHairByClass(String className){
HairInterface hair;
try {
hair = (HairInterface) Class.forName(className).newInstance();
return hair;
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
HairInterface接口
package com.kero99.ygc.project;
public interface HairInterface {
//画发型
public void draw();
}
LeftHair 类的实现
package com.kero99.ygc.project;
public class LeftHair implements HairInterface{
//画了一个左偏分发型
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("左偏分发型...");
}
}
RightHair 类的实现
package com.kero99.ygc.project;
public class RightHair implements HairInterface{
//画了一个右偏分发型
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("右偏分发型...");
}
}
Test 类
package com.kero99.ygc.project;
public class YGCTest {
public static void main(String[] args) {
// HairInterface left=new LeftHair();
// left.draw();
// HairInterface right=new RightHair();
// right.draw();
// HairFactory factory=new HairFactory();
// HairInterface left=factory.getHair("left");
// left.draw();
// HairInterface right=factory.getHair("right");
// right.draw();
//通过具体类名称获取实例 可以用properties工具创建Class地址
HairFactory factory=new HairFactory();
HairInterface left= factory.getHairByClass("com.kero99.project.LeftHair");
left.draw();
}
}