设计模式之工厂方法模式

工厂方法模式的概念

定义一个创建产品对象的工厂接口,让子类决定实例化哪一个类,工厂方法使类的推迟到其子类当中。

工厂方法模式是一种非常常用的创建设计模式,它通过进一步的抽象使得类中不变的部分和具体的实现剥离开,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。

举个栗子

工厂方法模式的模型图

从图中我们可以看出,工厂方法模式一共有四个基本角色,抽象产品,抽象工厂,具体产品,具体工厂。这四种角色的关系也很明确,下面看一下简单的代码实现

  • 抽象产品
1
2
3
4
5
6
7
public abstract class Product {
public void method1() {
//公共方法
}
//抽象方法
public abstract void method2();
}
  • 具体产品
1
2
3
4
5
6
7
8
9
10
public class ConcreteProduct1 extends Product{
public void method2(){
//产品一的实现
}
}
public class ConcreteProduct2 extends Product{
public void method2(){
//产品二的实现
}
}
  • 抽象工厂
1
2
3
4
public abstract class Creator {
//抽象创建方法
public abstract <T extends Product> T createProduct(Class<T> c);
}
  • 具体工厂
1
2
3
4
5
6
7
8
9
10
11
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) {

}
return (T) product;
}
}

这样处理之后,当需要创建一个新的产品时,只需要实例化出工厂,把需要创建的类传递进去,就可以创建出这个类的实例,调用者不需要关心产品类的细节,只要接口不变,上层调用者就不需要变更。

适用范围

工厂方法模式最大的用途就是解除代码之间的耦合,在设计一个灵活的可扩展的系统的时候,使用工厂模式定义通用接口,我们可以很方便地扩展实现。

优点缺点

工厂方法模式的优点很多,首先它符合设计原则,可以很方便地对其进行扩展,代码结构清晰,同时它可以屏蔽产品类细节,封装性良好。

缺点大概就是过度使用可能会强行增加代码复杂度,在添加工厂类之前应该考虑清楚。

注意事项

工厂方法模式还有很多特殊情况,下面进行详细说明

简单工厂模式

简单工厂模式也叫静态工厂方法模式,它不属于23种设计模式,但是很常用。简单工厂模式的需求是,当一组产品只需要同一个工厂的时候,我们不需要对工厂进行抽象,也并不需要进行实例化,此时可以取消抽象工厂,同时工厂方法可以设置为静态方法,此时的模型图如下

简单工厂的优点就是简单,缺点就是工厂无法扩展,虽然如此,这种设计还是很常见的。

多个工厂类的工厂模式

上面的工厂方法我们只有一个具体的工厂,使用时候根据参数确定实例化的对象,我们也可以采用多个具体工厂的方式,代码如下(产品类同上)

  • 抽象工厂
1
2
3
4
public abstract class Creator {
//抽象创建方法
public abstract Product createProduct();
}
  • 具体工厂
1
2
3
4
5
6
7
8
9
10
public class ConcreteProduct1Creator extends Creator {
public Product createProduct() {
return new ConcreteProduct1();
}
}
public class ConcreteProduct2Creator extends Creator {
public Product createProduct() {
return new ConcreteProduct2();
}
}

运行结果和上面的相同,结构变得清晰了,缺点就是代码量增加了。

单例工厂设计

在单例设计模式中,我们利用构造方法私有化,实现了外部无法创建多例的效果,此时我们是依靠由单例类自己控制的唯一一个对象来实现的。而工厂的单例唯一的实例不是由单例类自己管理,而是把它交给一个工厂来管理,在工厂内部可以通过反射来创建实例。

当然,这种单例并不是真正意义上的单例,在其他类中其实也可以通过反射来创建对象。我们只要知道有这样一种设计方式就够了,此处不贴代码了。

尾声

工厂方法模式到此就要结束了,这是一种很常用的创建型设计模式,和很多模式都可以很好的组合,多使用才能熟练掌握。

如果我们要想从多个角度来控制产品,那么工厂方法模式可能就不够用了,需要用到下一篇介绍的抽象工厂模式。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!