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 简单工厂模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java代码实现截图功能(屏幕截图)

    java代码实现截图功能(屏幕截图)

    java代码实现截图功能,该JavaBean可以直接在其他Java应用程序中调用,默认的文件前缀为GuiCamera,文件格式为PNG格式,直接使用下面的类吧
    2013-12-12
  • java开发技巧代码写的快且bug少的原因分析

    java开发技巧代码写的快且bug少的原因分析

    这篇文章主要为大家介绍了java开发中代码写的快且bug少的原因分析及技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 新版Android Studio修改jdk版本的简单步骤

    新版Android Studio修改jdk版本的简单步骤

    这篇文章主要介绍了新版Android Studio修改jdk版本的简单步骤,升级Android Studio后,JDK版本设置选项消失,可以通过Settings面板进入Gradle设置,修改GradleJDK路径来解决问题,需要的朋友可以参考下
    2025-03-03
  • Mybatis-Plus中分页插件PaginationInterceptor的使用

    Mybatis-Plus中分页插件PaginationInterceptor的使用

    我们在开发的过程中,经常会遇到分页操作,本文主要介绍了Mybatis-Plus中分页插件PaginationInterceptor的使用,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • SpringBoot整合Minio的示例代码

    SpringBoot整合Minio的示例代码

    这篇文章主要介绍了SpringBoot整合Minio的示例代码,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • 详解spring与shiro集成

    详解spring与shiro集成

    这篇文章主要介绍了详解spring与shiro集成,需要的朋友可以参考下
    2017-09-09
  • Java阻塞队列四组API介绍(小结)

    Java阻塞队列四组API介绍(小结)

    这篇文章主要介绍了Java阻塞队列四组API介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • java 保留两位小数的几种方法

    java 保留两位小数的几种方法

    这篇文章主要介绍了JAVA中小数点后保留两位的几种方法,并有小实例,希望能帮助有所需要的同学
    2016-07-07
  • springcloud 熔断器Hystrix的具体使用

    springcloud 熔断器Hystrix的具体使用

    本篇文章主要介绍了springcloud 熔断器Hystrix的具体使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Java Comparable及Comparator接口区别详解

    Java Comparable及Comparator接口区别详解

    这篇文章主要介绍了Java Comparable及Comparator接口区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07

最新评论