一、定义
工厂方法模式:将对象的创建封装到工厂中去实现。
说道工厂方法模式我们一定会想到和它相关联的简单工厂模式和抽象工厂模式,简单工厂模式非常简单,这里我们不作讨论,抽象工厂模式下节讨论。
二、应用场景
当我们要创建的对象种类不确定时,后期有可能改变时,工厂方法模式比较适合。
比如:现在很多app都有消息中心,消息中心里包括很多消息类型,而每种消息类型的样式又不一样,并且随着版本的迭代还会增加很多消息类型,这时候用工厂方法模式就再合适不过了。
三、类图
四、模式的简单实现
其实工厂方法模式相对来说也比较简单,接下来我们还是以卖果汁的小店为例来演示一下工厂方法。
我们知道果汁店不止一种果汁,根据多态,我们将果汁抽象化。
public interface IJuice {
void make();
}
接下来我们实现几个具体的产品,假设有苹果汁、芒果汁、草莓汁。
public class AppleJuice implements IJuice{
@Override
public void make() {
System.out.println("make apple juice");
}
}
public class MangoJuice implements IJuice{
@Override
public void make() {
System.out.println("make mango juice");
}
}
public class StrawberryJuice implements IJuice{
@Override
public void make() {
System.out.println("make strawberry juice");
}
}
接下来是工厂类:
public class JuiceFactory {
public IJuice static makeJuice(String name){
if("apple".equals(name)){
return new AppleJuice();
}else if("mango".equals(name)){
return new MangoJuice();
}else if("strawberry".equals(name)){
return new StrawberryJuice();
}
return null;
}
}
接下来是场景类:
public class Client {
public static void main(String[] args) {
IJuice juice = JuiceFactory.makeJuice("apple");
juice.make();
}
}
根据点的果汁名字去制作相应的果汁,这时如果果汁店又加了两种果汁,葡萄汁和西瓜汁,我们还要去修改相应的JuiceFactory类里的逻辑,这会造成维护的成本太大,根据开闭原则,即对扩展开放,对修改关闭,我们修改下工厂类,实现具体工厂生产具体产品。
抽象工厂:
public interface IJuiceFactory {
IJuice makeJuice();
}
具体工厂:
public class AppleJuiceFactory implements IJuiceFactory{
@Override
public IJuice makeJuice() {
return new AppleJuice();
}
}
public class MangoJuiceFactory implements IJuiceFactory{
@Override
public IJuice makeJuice() {
return new MangoJuice();
}
}
public class StrawberryJuiceFactory implements IJuiceFactory{
@Override
public IJuice makeJuice() {
return new StrawberryJuice();
}
}
场景类:
public class Client {
public static void main(String[] args) {
IJuiceFactory juiceFactory = new AppleJuiceFactory();
IJuice juice = juiceFactory.makeJuice();
juice.make();
}
}
假如这时我们增加了葡萄汁,我们只需要增加一个具体工厂类和具体产品类即可,其他什么都不用改,这样我们维护起来就比较easy。
public class GrapeJuice implements IJuice{
@Override
public void make() {
System.out.println("make grape juice");
}
}
public class GrapeJuiceFactory implements IJuiceFactory{
@Override
public IJuice makeJuice() {
return new GrapeJuice();
}
}
五、总结
工厂方法模式就是将对象的创建放到具体的工厂类中去实现,因此对于多种种类的产品时,可以使用工厂方法模式进行解耦。
优点:扩展性比较好,当有新的产品产生时,不用修改现有的逻辑,只需要增加一个产品类和工厂类即可。降低了代码之间的耦合度,修改一种产品时并不会影响其他产品。
缺点:当产品种类较多时,会导致类过多,增加类定义的内存开销。