工厂模式的概念:
实例化对象,用工厂方法代替new操作,包括工厂方法模式和抽象工厂模式,抽象工厂模式是工厂方法模式的扩展。
定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。工厂方法把实例化的工作推迟到子类中去实现。
什么情况下适合工厂模式:
有一组类似的对象需要创建
在编码时不能预见需要创建哪种类的实例
系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节
例子:
接口:发型
实现类:左分,右分
工厂类:创建getHair()方法根据需求返回相应的实例,可以通过new或反射的方式返回实例。
public class HairFactory {
public HairInterface getHair(String key){
if ("left".equals(key)) {
return new LeftHair();
}else if ("right".equals(key)) {
return new RightHair();
}else {
return null;
}
}
public HairInterface getHairByClass(String className){
try {
HairInterface 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;
}
}
测试类:
public class MyTest {
public static void main(String[] args){
// HairInterface left = new LeftHair();
// left.draw();
HairFactory factory =new HairFactory();
// HairInterface left = factory.getHair("left");
// left.draw();
HairInterface left = factory.getHairByClass("com.dejun.factory.LeftHair");
left.draw();
}
}
抽象工厂和工厂方法的区别主要在于,抽象工厂是对多个产品。即工厂方法是一个接口下的不同类,而抽象工厂方法是对多个接口下的多个抽象类,在
利用工厂模式:
系统可以在不修改具体工厂角色的情况下引进新的产品
客户端不必关心对象如何创建,明确了职责
更好的理解面向对象的原则 面向接口编程 而不要面向实现编程