Java 设计模式以虹猫蓝兔的故事讲解简单工厂模式

 更新时间:2022年03月30日 14:52:47   作者:桃花键神  
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现

专栏介绍

本系列专栏会以虹猫蓝兔七侠传的故事为例来给大家详细分析所有模式,希望能给大家带来帮助!

本期介绍

模式: 简单工厂模式
案例: 一个天外陨石(抽象产品),三把剑(产品),
一个铸剑师(工厂)。
虹猫蓝兔莎莉分别找铸剑师造了三把剑。

什么是简单工厂模式

工厂模式的定义: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。

1、按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。
2、我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”。

优点

1、工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确。
2、客户端无需知道所创建具体产品的类名,只需知道参数即可。
3、也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。

缺点

1、简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。
2、使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
3、系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
4、简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构。

应用场景

对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。

简单工厂的实现

案例的主要角色如下:
工厂(SimpleFactory):铸剑师
抽象产品(Product):天外陨石(铸剑的原材料)
具体产品(ConcreteProduct):长虹剑、冰魄剑、紫云剑

案例: 虹猫蓝兔莎莉分别找铸剑师打造三把剑,长虹剑、冰魄剑、紫云剑。铸剑师利用原材料天外陨石来铸造这三把剑。

Ss接口(天外陨石):

接口内声明了一个方法

public interface Ss {
    void show();
}

Aa类实现接口Ss(长虹剑):

实现Ss接口

public class Aa implements Ss {
    @Override
    public void show() {
        System.out.println("打造了一把长虹剑");

    }
}

Bb类实现接口Ss(冰魄剑):

实现Ss接口

public class Bb implements Ss {
    @Override
    public void show() {
        System.out.println("打造了一把冰魄剑");

    }
}

Cc类实现接口Ss(紫云剑):

实现Ss接口

public class Cc implements Ss {
    @Override
    public void show() {
        System.out.println("打造了一把紫云剑");
    }
}

Zz类(铸剑师):

声明一个Ss类型属性,声明一个abc方法,用来判断需要造哪把剑,返回一把剑对象。

public class Zz {
    private static Ss ss;

    public Ss abc(String a) {
        if ("长虹剑".equals(a)) {
            ss = new Aa();
        } else if ("冰魄剑".equals(a)) {
            ss = new Bb();
        } else if ("紫云剑".equals(a)) {
            ss = new Cc();
        } else {
            System.out.println("铸剑失败");
        }
        return ss;
    }
}

Demo测试类:

new一个铸剑师(工厂对象),调用铸剑师的方法传入需要造的剑,返回一个剑的对象,然后调用剑对象中的方法看看造的对不对。

public class Demo {
    public static void main(String[] args) {
        Zz zz = new Zz();
        Ss aa = zz.abc("长虹剑");
        aa.show();
        Ss bb = zz.abc("冰魄剑");
        bb.show();
        Ss cc = zz.abc("紫云剑");
        cc.show();
        Ss dd = zz.abc("aa");
    }
}

在这里插入图片描述

下期预告

模式: 普通工厂模式
案例: 七侠找铸剑师夫妇造剑

敬请期待

到此这篇关于Java 设计模式以虹猫蓝兔的故事讲解简单工厂模式的文章就介绍到这了,更多相关Java 简单工厂模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Mybatis版本升级踩坑及背后原理分析

    浅谈Mybatis版本升级踩坑及背后原理分析

    这篇文章主要介绍了浅谈Mybatis版本升级踩坑及背后原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Java基础教程之基本类型数据类型、包装类及自动拆装箱

    Java基础教程之基本类型数据类型、包装类及自动拆装箱

    这篇文章主要给大家介绍了关于Java基础教程之基本类型数据类型、包装类及自动拆装箱的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • SpringBoot Application核心注解详解

    SpringBoot Application核心注解详解

    进入到@SpringBootApplication的源码,可以看到里面组合了三个我们感兴趣的注解@ComponentScan、@EnableAutoConfiguration、@SpringBootConfiguration,我们一一分析这三个注解
    2022-10-10
  • SpringBoot实现自定义事件的方法详解

    SpringBoot实现自定义事件的方法详解

    这篇文章将用实例来和大家介绍一下如何在SpringBoot中自定义事件来使用观察者模式。文中的示例代码讲解详细,对我们学习SpringBoot有一定的帮助,需要的可以参考一下
    2022-06-06
  • hadoop上传文件功能实例代码

    hadoop上传文件功能实例代码

    这篇文章主要介绍了hadoop上传文件功能实例代码,需要的朋友可以参考下
    2017-09-09
  • idea启动Tomcat时控制台乱码的解决方法(亲测有效)

    idea启动Tomcat时控制台乱码的解决方法(亲测有效)

    最近在idea中启动tomcat出现控制台乱码问题,尝试了很多方法,最后终于解决了,所以下面这篇文章主要给大家介绍了关于idea启动Tomcat时控制台乱码的解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Maven中dependencyManagement管理项目依赖项

    Maven中dependencyManagement管理项目依赖项

    在开发 Java 项目时,管理和协调依赖项的版本号是一项重要而繁琐的任务,本文主要介绍了Maven中dependencyManagement管理项目依赖项,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Spring cloud oauth2如何搭建认证资源中心

    Spring cloud oauth2如何搭建认证资源中心

    这篇文章主要介绍了Spring cloud oauth2如何搭建认证资源中心,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 详解java中的6种单例写法及优缺点

    详解java中的6种单例写法及优缺点

    在java中,单例有很多种写法,面试时,手写代码环节,除了写算法题,有时候也会让手写单例模式,这里记录一下单例的几种写法和优缺点。需要的朋友可以参考下
    2018-11-11
  • MybatisPlusException:Failed to process,Error SQL异常报错的解决办法

    MybatisPlusException:Failed to process,Error SQL异常报错的解决办法

    这篇文章主要给大家介绍了关于MybatisPlusException:Failed to process,Error SQL异常报错的解决办法,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03

最新评论