秦怀杂货店

General Store

  • 首页
  • 文章归档
  • 标签
  • 分类
  • 关于页面

  • 搜索
随便聊聊 数据结构 小游戏 数据库 Docker Springboot 系统设计 雪花算法 分布式 海量ip 最长回文子串 算法 面试题 线程池 多线程 线程 java学习 布隆过滤器 github 架构设计 docsify Git JVM LeetCode 杂货思考 设计模式 Lambda native isAssignableFrom 反射 剑指Offer mybatis SPI JDBC 编程工具 Java基础 集合

设计模式【2】-- 简单工厂模式了解一下?

发表于 2020-12-26 | 分类于 设计模式 | 0 | 阅读次数 505
  • 1.简单工厂模式介绍
  • 2.简单工厂模式举例
  • 3.简单工厂模式的优劣

1.简单工厂模式介绍

工厂模式,比较常用,属于创建型模式,也就是主要是用来创建对象的。工厂模式,有三种,主要分为:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

其中,本文要讲的就是,简单工厂模式,但是简单工厂模式,并不是属于GoF讲的23种设计模式中。简单工厂模式,也叫静态工厂方法模式。简单而言,就是有一个具体的工厂类,用来生产不同类型的对象,而这些对象,都有相似的特点,它们都实现同一个接口。

什么时候应该使用工厂模式?为什么需要工厂模式呢?

工厂模式主要是用来生成不同的对象,也就是屏蔽了对象生成的时候的复杂性,使用的时候不需要知道对象是怎么生成的,而只需要关注要生成什么对象。如果构造一个对象特别的费劲,而我们又经常需要构造生成这个对象,那么使用工厂模式是比较有利的。我们都知道,设计模式主要就是为了设计出更加简洁,易懂,方便维护,方便拓展的代码。

如果一个很复杂的对象,要在多个地方构建,那么要是改动一次,我们就需要找出所有引用的地方,逐一修改,那会很麻烦。

简单工厂模式主要有三种角色:

  • 简单工厂:负责创建所有的实例,依照不同的类型创建不同的对象,也就是产品。
  • 抽象产品接口:也就是所有产品的一个抽象,一般是所有产品都需要实现的接口。
  • 具体产品:实现抽象产品接口,不同的产品做不一样的实现。

2.简单工厂模式举例

假设现在有一个果园,用来种植各种水果,但是每一种水果种植的方式又不一样。首先,先定义一个接口Fruit:

public interface Fruit {
    public void process();
}

定义三种水果Apple,Pear,Orange:

public class Apple implements Fruit{
    public void process() {
        System.out.println("I am an Apple");
    }
}
public class Pear implements Fruit{
    public void process() {
        System.out.println("I am a Pear");
    }
}
public class Orange implements Fruit{
    public void process() {
        System.out.println("I am an Orange");
    }
}

创建一个工厂类:

public class FruitFactory {
    public static Fruit getFruit(String name) {
        if ("Apple".equalsIgnoreCase(name)) {
            return new Apple();
        } else if ("Pear".equalsIgnoreCase(name)) {
            return new Pear();
        } else if ("Orange".equalsIgnoreCase(name)) {
            return new Orange();
        }
        return null;
    }
}

测试代码如下:

public class FruitTest {
    public static void main(String[] args) {
        Fruit apple = FruitFactory.getFruit("Apple");
        apple.process();
        Fruit pear = FruitFactory.getFruit("Pear");
        pear.process();
        Fruit orange = FruitFactory.getFruit("Orange");
        orange.process();
    }
}

测试结果如下:

image-20201218231609645

这样的写法,如果后续再来了一种水果,那么只需要实现接口,同时在工厂中增加一个case即可。

3.简单工厂模式的优劣

优点:

  • 产品和工厂的职责比较分明,工厂负责创建,产品负责自己的实现
  • 产生/构建产品比较简单,不需要关注内部细节,只需要知道自己想要哪一种。
  • 增加或者修改产品比较简单,解耦合。

凡事都有优劣,简单工厂方法的缺点在于:

  • 工厂类的重要性很高,一旦出现问题,影响所有的产品。
  • 产品数量一旦特别多的时候,工厂内部逻辑会比较复杂,不利于理解和维护。
  • 静态方法不利于继承和实现。

从以上的优劣,我们可以知道,其实如果产品创建过程比较复杂,而且个数不多,都是依靠某些参数来创建的话,抽象出简单工厂模式,其实是比较有利的一种做法。

  • 本文作者: 秦怀杂货店
  • 本文链接: http://aphysia.cn/archives/designpattern02
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# 随便聊聊 # 数据结构 # 小游戏 # 数据库 # Docker # Springboot # 系统设计 # 雪花算法 # 分布式 # 海量ip # 最长回文子串 # 算法 # 面试题 # 线程池 # 多线程 # 线程 # java学习 # 布隆过滤器 # github # 架构设计 # docsify # Git # JVM # LeetCode # 杂货思考 # 设计模式 # Lambda # native # isAssignableFrom # 反射 # 剑指Offer # mybatis # SPI # JDBC # 编程工具 # Java基础 # 集合
设计模式【1.3】-- 为什么饿汉式单例是线程安全的?
剑指Offer【29】-- 最小的k个数
  • 文章目录
  • 站点概览
秦怀杂货店

秦怀杂货店

纵然缓慢,驰而不息。

145 日志
19 分类
37 标签
Github E-mail
Creative Commons
0%
© 2022 秦怀杂货店
由 Halo 强力驱动
|
主题 - NexT.Pisces v5.1.4