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

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

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


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


一、简单工厂


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


当然它也有一些缺点:


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


三、抽象工厂


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


 

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


四、总结


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


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


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

 

分类: 设计模式

相关文章
|
4月前
|
设计模式 存储 Java
认真学习设计模式之观察者模式(Observer Pattern)
认真学习设计模式之观察者模式(Observer Pattern)
28 0
|
7月前
|
设计模式
110.【十万字带你深入学习23种设计模式】(二十二)
110.【十万字带你深入学习23种设计模式】
34 1
110.【十万字带你深入学习23种设计模式】(二十二)
|
7月前
|
设计模式 Java
110.【十万字带你深入学习23种设计模式】(二十一)
110.【十万字带你深入学习23种设计模式】
35 1
|
7月前
|
设计模式 算法 Java
110.【十万字带你深入学习23种设计模式】(十九)
110.【十万字带你深入学习23种设计模式】
40 1
|
6月前
|
设计模式 架构师 Java
阿里P8架构师都要学习研究的java加强版23种设计模式神级PDF文档
说在前面的话 Java作为老牌纯正的编程语言,在规范性上有着天然优势。因此本版的设计模式讲解全部用Java语言来描述,并针对Java语言的特性对讲解内容做了相当大的改动。 不知道大家是否听过编程界的一段话:掌握设计模式相当于华山派的"气宗",是程序员的内功修为,虽然在同样的学习时间下,类似Python这种"剑宗"的开发模式见效更快,但是长远来看,"气宗"才是走向软件架构师以上级别的必由之路。 所以,掌握气宗就掌握了编程命脉,然而学习设计模式有四大境界: 接下来给大家分享的就是java溢彩加强版大话设计模式包含的内容知识点。 总目录 主要内容 本文是百万销量的经典畅销书《
119 0
|
5月前
|
设计模式 缓存 Java
认真学习设计模式之建造者模式(Builder Pattern)
认真学习设计模式之建造者模式(Builder Pattern)
56 1
|
3月前
|
设计模式 监控 安全
多线程设计模式【多线程上下文设计模式、Guarded Suspension 设计模式、 Latch 设计模式】(二)-全面详解(学习总结---从入门到深化)
多线程设计模式【多线程上下文设计模式、Guarded Suspension 设计模式、 Latch 设计模式】(二)-全面详解(学习总结---从入门到深化)
62 0
|
24天前
|
设计模式 关系型数据库 数据库
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
21 1
|
3月前
|
设计模式 安全 数据库
创建型设计模式-单例模式/工厂模式/抽象工厂
创建型设计模式-单例模式/工厂模式/抽象工厂
37 0
|
3月前
|
设计模式 安全 Java
多线程设计模式【线程安全、 Future 设计模式、Master-Worker 设计模式 】(一)-全面详解(学习总结---从入门到深化)
多线程设计模式【线程安全、 Future 设计模式、Master-Worker 设计模式 】(一)-全面详解(学习总结---从入门到深化)
26 0