工厂方法
工厂方法定义:定义一个用于创建对象的接口,并且让其子类决定实例化到哪一个类,工厂方法使一个类的实例化延迟到子类
工厂方法角色
1: 抽象工厂角色(Creator)
该角色是工厂方法模式的核心,任何创建对象的工厂类必须实现这个接口
public interface Creator{
/**
* 工厂方法,创建产品(对象)的时候输入参数类型即可
*/
public <T extends Product> T factory(Class<T> c);
}
2:具体工厂角色(Concrete Creator)
该角色实现了Creator接口,受应用程序逻辑控制,应用程序调用此类以获得具体要创建的产品
public class ConcreteCreator implements Creator{
@override
public <T extends Product> T factory(Class<T> c){
Product product = null;
try{
product = (Product) Class.forName(c.getName.newInstance());
}catch(Exception e){
}
return (T)product;
}
}
3:抽象产品角色(Product)
该角色负责定义对外产品的共性,实现对产品的最高抽象定义
public interface Product{
//所有产品公共类方法
public void method1();
public void method2();
}
4:具体产品角色
该角色是实现了抽象产品接口的具体类,是产品的具体实例
public class ConcreteProduct implements Product{
//实现接口方法
@override
public void method1(){
System.out.println("ConcreteProduct.method1()");
}
@override
public void method2(){
System.out.println("ConcreteProduct.method2()")
}
}
具体调用代码
这里演示具体如何调用到以上定义的产品
public class Demo{
public static void main(String [] args ){
//得到工厂
Creator creator = new ConcreteCreator();
//得到具体产品
Product product = creator.factory(ConcreteProduct.class);
//调用产品的方法
product.method1();
product.method2();
}
}
工厂方法的优点
1:良好的封装性,代码结构清晰,每个产品对应一个工厂类,所有实例创建均由工厂负责完成
2:比较容易扩展,新增产品或者修改部分产品的业务逻辑并不会改变其创建和调用方式
3:屏蔽了产品类,无论产品如何变化,调用者始终通过接口调用
4:高度抽象,有利于解除耦合
工厂方法使用场景
1:可以替代new关键字
2:当需要灵活的可扩展的框架的时候,可以优先考虑工厂模式
3:可以使用在异构项目中,如webservice与一个非java项目交互,可减少与外围系统耦合
4:可以使用在测试驱动开发的框架下,测试的时候可以避免强耦合关系导致的问题
工厂模式的扩展
1:简单工厂模式
2:多工厂模式
3:替代单例模式
4:延迟初始化
注:以上内容,后期再做补充,在这里不详细做讨论,后期补充链接
参考资料:设计模式之禅(二)