暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

SET技术干货 2021-10-22
203

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


一、简单工厂


简单工厂严格来说不能算作一种设计模式,它更像一种编程习惯,用于将具体类的创建从客户端解耦,他的实现很简单,就是建立一个工厂类,通过其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、支持扩展,当新增一个类时,只需要同步创建对应的工厂即可


当然它也有一些缺点:


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

三、抽象工厂


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

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


四、总结


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


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


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


文章转载自SET技术干货,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论