定义:
工厂方法模式同样属于类的创建型模式,又名多态工厂模式,定义一个创建产品对象的工厂接口,将实际的创建工作推迟到子类中去。
主要角色及UML:
抽象工厂角色:Creator 工厂方法模式的核心,与应用程序无关
具体工厂角色:ConcreteCreator 具体工厂类,包含与应用程序相关的逻辑,并受到应用程序的调用以创建产品
抽象产品角色:Product 工厂方法所创建对象的超类
具体产品角色:ConcreteProduct 实现里抽象产品角色定义的接口
源代码如下:
// 抽象工厂角色
package com.pattern.factorymethod;
public interface Creator{
public Product createProduct();
}
// 具体工厂类A
package com.pattern.factorymethod;
public class ConcreateCreatorA implements Creator{
public Product createProduct(){
return new ConcreateProductA();
}
}
// 具体工厂类B
package com.pattern.factorymethod;
public class ConcreateCreatorB implements Creator{
public Product createProduct(){
return new ConcreateProductB();
}
// 抽象产品
package com.pattern.factorymethod;
public interface Product{
public void say();
}
// 具体产品A
package com.pattern.factorymethod;
public class ConcreateProductA implements Product{
public void say(){
System.out.println("具体产品A");
}
}
// 具体产品B
package com.pattern.factorymethod;
public class ConcreateProductB implements Product{
public void say(){
System.out.println("具体产品B");
}
}
// 客户端测试类
package com.pattern.factorymethod;
public class Client{
public static void main(String []args){
Creator ctA = new ConcreateCreatorA();
Product pA = ctA.createProduct();
pA.say();
Creator ctB = new ConcreateCreatorA();
Product pB = ctB.createProduct();
pB.say();
}
}
结果:
具体产品A
具体产品B
优缺点:
优点:工厂方法类的核心是一个抽象工厂类,所有具体的工厂类都必须实现这个接口。当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,这就很好的符合了“开放-封闭”原则。
缺点:使用工厂方法模式的时候,客户端需要决定实例化哪一个具体的工厂。也就是说工厂方法法模式把简单工厂模式的内部判断逻辑转移到了客户端代码。而且使用该模式需要增加额外的代码,这就导致工作量的增加。