百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

简单工厂模式详解:优缺点、实现步骤、以及应用场景全面总结

citgpt 2024-07-04 14:53 11 浏览 0 评论

简单工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,这种类型的设计模式属于创建型模式。

本文从一个具体的例子逐步分析,来体会简单工厂模式的应用场景和利弊@mikechen

简单工厂模式详解:优缺点、实现步骤、以及应用场景全面总结

简单工厂模式的定义

简单工厂模式(Simple Factory),又被称为"静态工厂方法模式",它属于类创建型模式,同属于创建型模式的还有(工厂方法模式,抽象工厂模式,单例模式,建造者模式)。

用一个现实生活的例子更容易理解:生活中的工厂是负责生产产品的,同样在设计模式中,简单工厂模式我们可以理解为负责生产对象的一个类,称为“工厂类”。

简单工厂模式的结构

1.工厂类

工厂角色负责实现创建所有实例的内部逻辑。

2.抽象产品

抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口。

3.具体产品

具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。

简单工厂模式的实现

主要分为三个步骤:

1.创建抽象产品类

创建抽象产品类的作用:主要是定义具体产品的公共接口

package com.mikechen.java.design.factory.simple;

/**
* 抽象产品
*
* @author mikechen
*/
public abstract  class Product {




    public abstract  void Create();
    
}

2.创建具体产品类

创建具体产品类的作用:继承抽象产品类,定义生产的具体产品

package com.mikechen.java.design.factory.simple;



/**
* 描述类的作用
*
* @author mikechen
*/
public class ConcreteProduct extends Product{




    @Override
    public void Create() {
        System.out.println("生产具体的产品");
    }
}

3.创建工厂类

创建工厂类的作用:通过创建静态方法从而根据传入不同参数创建不同具体产品类的实例。

package com.mikechen.java.design.factory.simple;


/**
* 工厂
*
* @author mikechen
*/
public class Factory {
    public static Product newInstance() {
        return new ConcreteProduct();
    }
}

这里我做了简化,实际的情况可以根据传入的具体产品参数来实现具体的产品即可。

简单工厂模式的优缺点

1. 优点

将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;

把初始化实例时的工作放到工厂里进行,使代码更容易维护。

2. 缺点

工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;

违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。

简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。

简单工厂模式的应用场景

1.客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时;

2.客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数

3.当工厂类负责创建的对象具体产品比较少时,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。

简单工厂模式的总结

1.简单工厂模式包含三个角色:

  • 工厂角色负责实现创建所有实例的内部逻辑;
  • 抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口;
  • 具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。

2.简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。

3.简单工厂模式适用情况包括:工厂负责创建的对象比较少,客户端只知道传入工厂类的参数,对于如何创建对象不关心的情况。

如果不满足于文章详解,私信【架构】获取视频详解!

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: