设计模式学习——工厂模式

说到工厂模式,可能我们脑海中就会蹦出简单工厂、工厂方法以及抽象工厂这几个名词,但是说起他们之间的区别、各自都解决了什么样的问题,那就比较懵了,所以今天我们详细梳理下这三者之间的区别与联系。

一、简单工厂

简单工厂严格来说不能算作一种设计模式,它更像一种编程习惯,用于将具体类的创建从客户端解耦,他的实现很简单,就是建立一个工厂类,通过其create方法,根据所传入参数的不同,返回对应的对象,举例如下:

public class AnimalFactory {

    public static Animal create(String type) {
        if ("cat".equals(type)) {
            return new Cat();
        } else if ("dog".equals(type)) {
            return new Dog();
        } else if ("pig".equals(type)) {
            return new Pig();
        } else {
            return null;
        }
    }
}

我们可以看到简单工厂确实很简单并且问题也很明显:

1、由于任何动物类都要通过工厂类创建,这就会导致create方法代码量非常庞大

2、不支持扩展,如果在增加新的动物类,就需要修改create方法,不满足开闭原则。

二、工厂方法

对于简单工厂存在的问题,工厂方法恰好能完美解决,工厂方法定义了一个创建对象的接口,由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类。

工厂方法的类图如下:

 

代码如下:

public abstract class AnimalFactory {
    public abstract Animal create();
}

public class CatFactory extends AnimalFactory{
    @Override
    public Animal create() {
        return new Cat();
    }
}

public class DogFactory extends AnimalFactory{
    @Override
    public Animal create() {
        return new Dog();
    }
}

public class PigFactory extends AnimalFactory{
    @Override
    public Animal create() {
        return new Pig();
    }
}

我们可以看到工厂方法有以下优点:

1、减轻简单工厂的负担,把一种类交由一种工厂创建

2、支持扩展,当新增一个类时,只需要同步创建对应的工厂即可

当然它也有一些缺点:

对于某一族产品的创建时,它不能很好的支持。

三、抽象工厂

抽象工厂提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。这就很好的解决了工厂方法存在的问题。其类图如下:

 

通过和工厂方法的类图进行比较,我们可以看出工厂方法是抽象工厂的一种极端情况,而抽象工厂是工厂方法的推广。

四、总结

简单工厂:使用一个工厂对象用来生产同一等级结构中的任意产品。(不支持拓展增加产品)

工厂方法:使用多个工厂对象用来生产同一等级结构中对应的固定产品。(支持拓展增加产品)

抽象工厂:使用多个工厂对象用来生产不同产品族的全部产品。(不支持拓展增加产品;支持增加产品族)

 

posted @ 2021-05-19 23:36  阿拉懒神灯  阅读(37)  评论(0编辑  收藏  举报