工厂方法模式定义
Define an interface for creating an object,but let subclasses decide which class to instantite.Factory Method lets a class defer instantation to subclass.
工厂方法模式的一般类图
工厂方法模式的通用源码
1.抽象产品类
package FactoryMethod;
public abstract class Product {
public void method1(){
System.out.println("这是产品类的业务逻辑处理方法");
}
public abstract void method2();
2.具体的产品类
package FactoryMethod;
public class ConcreteProduct1 extends Product {
@Override
public void method2() {
System.out.println("这是产品一的业务逻辑处理方法");
}
}
package FactoryMethod;
public class ConcreteProduct2 extends Product {
@Override
public void method2() {
System.out.println("这是产品二的业务逻辑处理方法");
}
}
3.抽象工厂类
package FactoryMethod;
public abstract class Creator {
public abstract <T extends Product> T createProduct(Class<T> c);
}
4.具体工厂类
package FactoryMethod;
public class ConcreteCreator extends Creator {
public <T extends Product> T createProduct(Class<T> c) {
Product product = null;
try {
product = (Product)Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T)product;
}
}
5.客户端代码
package FactoryMethod;
public class Client {
/**
* @author ZhangH
*/
public static void main(String[] args) {
Creator creator = new ConcreteCreator();
Product product1 = creator.createProduct(ConcreteProduct1.class);
Product product2 = creator.createProduct(ConcreteProduct2.class);
product1.method1();
product1.method2();
System.out.println();
product2.method1();
product2.method2();
}
}
工厂方法模式的优点
优点:
1. 良好的封装性,降低模块间的耦合;
2. 面向产品接口,屏蔽产品类。
3. 典型的解耦框架。高层模块只需要知道产品的抽象类。
4. 符合迪米特法则、依赖倒置原则、里氏替换原则。
工厂方法模式的特殊应用
简单工厂模式(静态工厂模式)
描述:去掉了工厂方法模式中的工厂抽象类,同时把具体工厂方法中的方法设置为静态。
优点:简化结构、调用过程
缺点:不利于扩展、不符合开闭原则
多个工厂方法模式
描述:对普通工厂方法模式的改进,多个工厂方法模式是提供多个工厂方法,分别创建对象
优点:创建类的职责清晰,结构简单
缺点:增加扩展难度(增加协调类,封装子工厂类,对高层提供统一的访问接口)
替代单例模式
描述:采用工厂方法模式实现单例模式的功能
做法:
私有单例类,不允许new出对象
在工厂类内,使用反射机制创建一个对象
延迟初始化
描述一个对象被消费完毕后,不立刻释放,工厂类保持其,等待再次使用。
做法:
在工厂类中以集合的形式容纳所有产生对象
每次请求创建时,如果集合中已有则直接返回;若没有则创建,放入集合并返回
参考资料:
《设计模式之禅》 秦小波著
《JAVA设计模式》 来自网络