设计模式轻松学【三】简单工厂模式

简介: 简单工厂模式又称为静态工厂模式,它不属于23种设计模式,但现实中却经常会用到。

概述

具体实现为定义一个类,该类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。其实就是将一个具体类的实例化交给一个类的静态方法来执行,该类被称为工厂类,静态方法被称为静态工厂方法,思想也非常简单。

  • 参与角色

    • 工厂(Factory)

      是简单工厂模式的核心,在工厂类中提供了静态工厂方法,它负责实现创建所有具体产品类的实例。工厂类可以被外界直接调用,创建所需的产品对象。

    • 抽象产品(Abstract Product)

      它是所有具体产品角色的父类,它负责描述所有具体产品所共有的公共接口,抽象产品角色可以用一个Java接口或者Java抽象类实现。

    • 具体产品(Concrete Product)

      继承自抽象产品角色,一般为多个,是简单工厂模式的创建目标。被创建出来的对象是该具体产品的实例。

    image.png

  • 优势

    在简单工厂模式中,客户端用过工厂类来创建一个产品实例,而无须直接使用new关键字来创建对象,客户端只需要知道自己需要什么产品,如何来使用产品就可以了,具体的产品生产任务由具体的工厂类来实现。他是工厂模式家族中最简单的一员。

模式实现分析

  • 实例分析

    你的女朋友,平时喜欢喝红茶、绿茶,因此你也掌握了这2种茶的制作方式,她想喝的时候你需要马不停蹄的做出来,并且端给她喝,有如下代码

    
    class RedTea {
        public RedTea(){
            System.out.println("我在制作红茶");
        }
    
        public void drinkRedTea(){
            System.out.println("喝红茶");
        }
        
        public void drinkRedTeaAfter(){
            System.out.println("喝红茶之后,开始收拾");
        }
    }
    
    class GreenTea {
        public GreenTea(){
            System.out.println("我在制作绿茶");
        }
    
        public void drinkGreenTea(){
            System.out.println("喝绿茶");
        }
        
        public void drinkGreenTeaAfter(){
            System.out.println("喝绿茶之后,开始收拾");
        }
    }

    今天她想喝红茶,所以你制作了红茶,并且端给她喝的时候告诉他这是红茶

    public class Demo1 {
        public static void main(String[] args) {
            RedTea redTea = new RedTea();
            redTea.drinkMilkTea();
        }
    }

    每次你做完后都会用不同的杯子装,后来你发现,红茶、绿茶都是茶,完全可以用一个杯子来装,并且这些茶的材料乱七八糟存放,为了统一管理,所以你引入了一个茶的概念

    abstract class Tea {
        abstract void drink();
        abstract void drinkAfter();
    }
    
    class RedTea extends Tea{
        
    }
    class GreenTea extends Tea{
        
    }

    这样你的操作更加规范,速度更快了,你女朋友觉得很幸福。但随着时间推移,你越来越忙,你就在想有没有红茶制作机器,直接将所有操作交给红茶机器去做,这样你只需要告诉红茶机器女朋友需要喝什么,就能够制作出相应的东西,这个时候你引入了红茶研磨机,这其实就是我们所说的工厂。

    class TeaFactory {
        public static Tea getTea(String teaName) throws Exception{
            if(teaName.equals("红茶")){
                return new RedTea();
            }else if(teaName.equals("绿茶")){
                return new GreenTea();
            }else{
                throw new Exception();
            }
        }
    }

    各种茶的类不变,仅仅是客户端发调用变了

    public class Demo1 {
        public static void main(String[] args) {
            //今天想喝绿茶
            try {
                Tea tea = TeaFactory.getTea("绿茶");
                tea.drink();
                tea.drinkAfter();
            } catch (Exception e) {
                System.out.println("不会做该茶");
            }
            
        }
    }

    我们可以看到,有了工厂之后,你再也不用自己手动去做了,你只需要告诉工厂,你女朋友要喝什么茶,研磨机就会自动将想要的茶给创建出来,这样我们在获取所需要的对象时会更加方便。

模式缺点

  • 由于工厂类集中了所有产品创建逻辑,工厂类一般被我们称作“全能类”或者“上帝类”,因为所有的产品创建他都能完成,这看似是好事,但仔细想想是有问题的。比如全国上下所有的事情都有主席一个人干会不会有问题,当然有!一旦不能正常工作,整个系统都要受到影响。
  • 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
  • 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,
  • 不利于系统的扩展和维护。所以说从工厂的角度来说简单工厂模式是不符合“开-闭”原则的。
    简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

适用场景

在以下情况下可以使用简单工厂模式:

  1. 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
  2. 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。
  • 在JDK中的应用

    JDK类库中广泛使用了简单工厂模式,如工具类java.text.DateFormat,它用于格式化一个本地日期或者时间。

    public final static DateFormat getDateInstance();
    public final static DateFormat getDateInstance(int style);
    public final static DateFormat getDateInstance(int style,Locale locale);
目录
相关文章
|
8天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
10天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
3天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
12 1
|
26天前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
19 3
|
2月前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
2月前
|
设计模式 Java Spring
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)
|
2月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
28天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
33 0

热门文章

最新文章

  • 1
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    45
  • 2
    C++一分钟之-C++中的设计模式:单例模式
    51
  • 3
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    36
  • 4
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    59
  • 5
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    54
  • 6
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    39
  • 7
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 8
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    102
  • 9
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    74
  • 10
    Go语言设计模式:使用Option模式简化类的初始化
    71