工厂模式的核心就是不用new来新建对象,将调用者和创建对象的过程解耦。本文中将介绍工厂模式下的三类划分,并且分析其优点和不足之处。
1.简单工厂模式
示例代码如下,对于实现了同一接口的一类产品,可以利用factory方法来完成对它们的创建和返回,如果构造方法比较复杂,就在工厂方式里完成配置,在外部使用时就会简单得多。同时新增其他产品时也只需要增加对应代码即可
public class GoodsFactory {
public GoodsFactory(){
}
public static Product getProduct(String name){
switch (name){
case "goods1":
return new Goods1();
case "goods2":
return new Goods2();
default:
System.out.println("工厂异常");
break;
}
return null;
}
}
interface Product{
void doFunc();
}
class Goods1 implements Product{
@Override
public void doFunc() {
System.out.println("111");
}
}
class Goods2 implements Product{
@Override
public void doFunc() {
System.out.println("222");
}
}
简单工厂方法的缺点就是,每次要新增产品,都需要修改工厂方法中的getProduct方法。一般来说写好的代码尽量不要修改,即应该对修改封闭,对扩展开放,故简单工厂模式还可以进一步修改为工厂方法模式。
2.工厂方法模式
说白了就是,为了避免每次新增产品都要去修改getProduct方法,那干脆对于每一个产品都创建一个专属于自己的工厂就好了。打个比方,简单工厂方法好比我有一个厂子,它生产帽子和鞋,那如果我想它生产衬衫就要在工厂内部加一条衬衫流水线。但是工厂方法模式相当于我有好几个厂子,第一个生产帽子,第二个生产鞋,如果现在要生产衬衫就再加一个工厂来专门生产衬衫,这样就不用修改已有的工厂了。
public class GoodsFactory {
public static void main(String[] args) {
Product goods1=new Factory1().getProduct();
Product goods2=new Factory2().getProduct();
goods1.doFunc();
goods2.doFunc();
}
}
interface Product{
void doFunc();
}
class Goods1 implements Product{
@Override
public void doFunc() {
System.out.println("111");
}
}
class Goods2 implements Product{
@Override
public void doFunc() {
System.out.println("222");
}
}
interface Factory{
Product getProduct();
}
class Factory1 implements Factory{
@Override
public Product getProduct() {
return new Goods1();
}
}
class Factory2 implements Factory{
@Override
public Product getProduct() {
return new Goods2();
}
}
这样的代码更符合设计原则,扩展性更强,但是代码量会大大增加。一般来说,实际使用中不如简单工厂模式。
3.抽象工厂方法
抽象的抽象,进一步抽象工厂方法模式,再抽象出一层来,创建一个工厂接口,并且让所有工厂实现该接口,最后用一个超级工厂来创建所有的工厂。正如简单工厂模式中,对于实现了同样接口的产品,用一个工厂来生产它们。在抽象工厂方法中,对于实现了同一个接口的工厂(即,同一族的工厂),也用一个接口来联合起来。当用户需要一件衣服时,可以从生产红色短袖和蓝色衬衫的工厂中自由选择————因为它们都实现了衣服工厂这个接口。