工厂方法模式定义
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.抽象产品类
1
2
3
4
5
6
7
8
package
FactoryMethod;
public
abstract
class
Product {
public
void
method1(){
System.out.println(
"这是产品类的业务逻辑处理方法"
);
}
public
abstract
void
method2();
2.具体的产品类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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.抽象工厂类
1
2
3
4
5
package
FactoryMethod;
public
abstract
class
Creator {
public
abstract
extends
Product> T createProduct(Class c);
}
4.具体工厂类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package
FactoryMethod;
public
class
ConcreteCreator
extends
Creator {
public
extends
Product> T createProduct(Class c) {
Product product =
null
;
try
{
product = (Product)Class.forName(c.getName()).newInstance();
}
catch
(Exception e) {
e.printStackTrace();
}
return
(T)product;
}
}
5.客户端代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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设计模式》 来自网络