开发者社区> 阿拉懒神灯> 正文

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

简介: 说到工厂模式,可能我们脑海中就会蹦出简单工厂、工厂方法以及抽象工厂这几个名词,但是说起他们之间的区别、各自都解决了什么样的问题,那就比较懵了,所以今天我们详细梳理下这三者之间的区别与联系。 一、简单工厂 简单工厂严格来说不能算作一种设计模式,它更像一种编程习惯,用于将具体类的创建从客户端解耦,他的实
+关注继续查看

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


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


一、简单工厂


简单工厂严格来说不能算作一种设计模式,它更像一种编程习惯,用于将具体类的创建从客户端解耦,他的实现很简单,就是建立一个工厂类,通过其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方法,不满足开闭原则。


二、工厂方法


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


工厂方法的类图如下:


image

 

代码如下:


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、支持扩展,当新增一个类时,只需要同步创建对应的工厂即可


当然它也有一些缺点:


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


三、抽象工厂


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


image

 

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


四、总结


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


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


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

 

分类: 设计模式

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
[设计模式]工厂方法模式
简介 工厂方法模式 (Factory Method)定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。  工厂模式是一种类创建型模式 (可参考 设计模式 创建型模式)。
753 0
反射与工厂设计模式 | 带你学《Java语言高级特性》之八十三
通过案例逐步掌握工厂设计模式,通过工厂类获取指定接口的实例化对象。
915 0
设计模式 抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
619 0
设计模式学习——策略模式
一、介绍 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 策略模式应用的例子很多,比如最常见的Java类库中的 Comparator,它将对象的具体比较算法封装起来,我们可以根据所要比较的对象的类型自由选择。策略模式类图如下
20 0
设计模式-工厂方法模式
1. 简单工厂模式(Simple Factory Parrent) /** * 在讲工厂方法模式之前,先将一个简单工厂模式,这个模式实现了对象和被调用者的解耦,但是依旧有很多问题,工厂方法模式就是 * 从建工工厂模式演变过来的 * *...
927 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
20895 0
设计模式学习——工厂模式
说到工厂模式,可能我们脑海中就会蹦出简单工厂、工厂方法以及抽象工厂这几个名词,但是说起他们之间的区别、各自都解决了什么样的问题,那就比较懵了,所以今天我们详细梳理下这三者之间的区别与联系。 一、简单工厂 简单工厂严格来说不能算作一种设计模式,它更像一种编程习惯,用于将具体类的创建从客户端解耦,他的实
27 0
+关注
阿拉懒神灯
关注微信公众号【阿拉懒神灯】所有文章均在此公众号首发
60
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载