设计模式之简单工厂模式

news2024/11/16 23:36:04

simple factory design pattern

简单工厂模式的概念、简单工厂模式的结构、简单工厂模式优缺点、简单工厂模式的使用场景、简单工厂模式的实现示例


注:简单工厂模式没有被收录在 GoF 的二十三种设计模式中。

1、简单工厂的概念

  简单工厂模式,与其说是设计模式,不如称它为编程习惯。简单工厂只提供了简单的对象生产能力,且违反了软件设计原则的 开闭原则。其没有被收录在 GoF 的二十三种设计模式中。

2、简单工厂的结构

  • 抽象产品:定义了产品的行为。
  • 具体产品:实现了抽象产品接口,使产品具像化。
  • 具体工厂:实现了生产产品的功能。

simple-factory-class

3、简单工厂的优缺点

3.1、优点

  • 封装了对象创建的具体过程,使对象的创建的使用分离,降低耦合度。

3.2、缺点

  • 违反了开闭原则。若增加了新产品,则需要修改工厂类代码。

4、简单工厂的使用场景

  • 需要将对象创建过程与对象使用过程解耦时。
  • 产品固定或变化率低时。

5、简单工厂的实现示例

  抽象产品:

public interface Product {

    /**
     * 定义产品行为
     */
    void behavior();
}

  具体产品一:

public class OneProduct implements Product {

    @Override
    public void behavior() {
        System.out.println("我是产品一");
    }
}

  具体产品二:

public class TwoProduct implements Product {

    @Override
    public void behavior() {
        System.out.println("我是产品二");
    }
}

  工厂类:

public class ProductFactory {

    /**
     * 生产产品
     * @param type
     * @return
     */
    public Product product(String type) {
        Product product;
        if ("one".equals(type)) {
            product = new OneProduct();
        } else if ("two".equals(type)) {
            product = new TwoProduct();
        } else {
            throw new RuntimeException("暂不能生产该类型产品");
        }
        return product;
    }
}

  测试类:

public class SimpleFactoryTest {

    public static void main(String[] args) {
        ProductFactory factory = new ProductFactory();

        Product product = factory.product("one");
        Product product1 = factory.product("two");

        product.behavior();
        product1.behavior();

        Product product2 = factory.product("three");
    }
}

  测试结果:

我是产品一
我是产品二
Exception in thread "main" java.lang.RuntimeException: 暂不能生产该类型产品
	at org.xgllhz.designpattern.createtype.simplefactory.ProductFactory.product(ProductFactory.java:23)
	at org.xgllhz.designpattern.createtype.simplefactory.SimpleFactoryTest.main(SimpleFactoryTest.java:19)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

32位PCI转CPCI转接板

功能型号 32位PCI转CPCI转接板,调试卡 支持PICMG 2.0 D3.0规范; 支持33MHz速率; 支持32bit总线; 功能描述 1、沉金工艺,接触更好; 2、四层板设计,抗干扰更好; 3、信号线等长处理&…

【论文精读9】MVSNet系列论文详解-AA-RMVSNet

AA-RMVSNet,论文名为:AA-RMVSNet: Adaptive Aggregation Recurrent Multi-view Stereo Network,CVPR2021(CCF A) 本文是MVSNet系列的第9篇,建议看过【论文精读1】MVSNet系列论文详解-MVSNet之后再看便于理解…

【Java 快速复习】 Java 内存模型 并发问题本质

【Java 快速复习】 Java 内存模型 & 并发问题本质 在 Java 领域,我们经常会说两个名词大家要有所区分: JVM 内存模型:这个所说的是 JVM 内存的划分规则,如 堆、栈、元空间等Java 内存模型:这个所说的是线程和主内…

【计算机网络】应用层

应用层的许多协议都是基于客户服务器方式。 客户和服务器指通信中所涉及的两个应用进程。客户服务器方式描述的是进程之间服务和被服务的关系。客户是服务请求方,服务器是服务提供方。 P2P模式:整个网络中的传输内容不再被保存在中心服务器中&#xff…

怎么裁剪视频?手把手教你裁剪

这两年,随着网课的不断发展,我们可以很轻松的就在网上找到各种课程视频。可是有时候,一些视频里面的重点内容往往只有那几分钟,当我们回顾的时候,需要不断跳转,这就显得有些麻烦。其实我们可以将重点内容裁…

【代码随想录】二刷-回溯算法

回溯算法 《代码随想录》 什么是回溯算法? 回溯算法也可以叫做回溯搜索法,它是一种搜索方式。回溯是递归的副产品,只要有递归就会有回溯。 回溯法的效率: 回溯法的本质是穷举,穷举所有可能,然后选出我们想要的答案。(n…

如何使用virtualenv实现python环境的隔离?

有关更多的Python 开发内容,可访问:《 Python Flask开发指南》​​​​​​​ virtualenv可以帮助我们来创建一个Python的虚拟环境,虚拟环境可以独立并隔离外部的python环境,方便我们对于不同项目使用不同的python依赖,已经依赖版本的不同而导致的错误。本篇文章主要来了解…

2022全年度冰箱十大热门品牌销量榜单

自2022年年初以来,各地纷纷部署支持包括冰箱在内的家电大宗消费政策措施,其中家电补贴政策是刺激家电消费的主旋律。宏观经济政策环境改善,利好冰箱行业的长期发展。 根据鲸参谋数据统计,今年京东平台冰箱的年度累计销量达到1400多…

论文阅读笔记《Learning Combinatorial Solver for Graph Matching》

核心思想 本文提出一种基于学习的组合求解器来实现图匹配。之前基于学习的图匹配方法都是利用神经网络提取特征构建关联矩阵,然后再利用可微分的Sinkhorn算法求解匹配矩阵。但本文提出的方法没有显式的构建关联矩阵和求解匹配矩阵的过程,而是将其转化成关…

SpringBoot:核心模块盘点

spring-boot-project 是 spring-boot 核心技术包,其中包含了 spring-boot 所有基础源码,其中很多模块都是我们了解 spring-boot 的重点。 ~ 本篇内容包括:spring-boot-project 包介绍、Spring Boot 核心模块 文章目录一、spring-b…

SpringCloud-Geteway之限流,熔断(超详细篇)

目录 一,Sentinel--服务容错 1.1 高并发带来的问题 1. 使用压测工具,对请求进行压力测试 2.修改配置文件中tomcat的并发数 1.2 服务雪崩效应 1.3 常见容错方案 1.4 Sentinel入门 什么是Sentinel 微服务集成Sentinel 安装Sentinel控制台 实现一个接口的限…

QTextLine、QGlyphRun、QTextLayout

QGlyphRun 一、描述 此类提供对字体中内部字形的直接访问。在某些情况下,开发人员可以对特定字体中的字形绘制到屏幕上进行更低级的控制。 当Qt显示以Unicode编码的文本字符串时,它会将Unicode点转换为基于字体的字形索引列表和位置列表。QGlyphRun 提…

企业对于源代码加密需求分析

需求 随着企业信息化发展的日益增长,软件行业厂商之间的竞争也愈加白热化,加上国内对知识产权的不够重视、山寨模仿产品的横行。保护源代码、保证企业的核心竞争力,成为众多软件研发企业的第一要务。那么企业应该如何保证源代码的安全呢&…

[附源码]计算机毕业设计常见Web漏洞对应PC应用系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

HTTP缓存机制(Cache-Control)

文章目录HTTP缓存机制HTTP缓存机制 HTTP 协议通常应用于分布式信息系统,所谓分布式信息系统,是指以计算机网络为基础,将系统的数据与功能分别布置在不同的地方,然后再通过网络将数据与功能连接的信息系统。由于系统需要处理大量的…

世界杯期间我使用Python生成二维码“为中国队辟谣”

二维码介绍 二维码本质上,就是一段字符串,我们可以把任意字符串,制作成一个二维码图片。在生活中,使用二维码更多的是一个URL(网址)。 引入 qrcode库 qrocde库网址:qrcode PyPI 进入网址之后…

[附源码]计算机毕业设计贷款申请审核管理系统论文Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

本地字节序与网络字节序的相互转换(IP地址、端口号)

一般数据在内存中是按照字节存储的,存储的方式分为大端和小端。在不知道对方主机的存储方式的情况下,我们不知道是否需要转换数据的存储方式。因此,TCP/IP协议规定:发送到网络的数据流应采用大端字节序! 如果当前主机…

年产3000吨原味奶糖生产车间工艺设计

目 录 摘 要 I Abstract II 1绪论 1 1.1原味奶糖的概念及其功能特性 1 1.2国外原味奶糖的现状 3 1.3我国的原味奶糖现状及开发前景 4 1.4原味奶糖原料的生产情况 4 2工艺流程设计 6 2.1 原味奶糖的生产工艺 6 2.1.1 溶糖与混合 7 2.1.2 连续真空薄膜熬糖 7 2.1.3 混合 8 2.1.4 …

阿里国际站-唤端技术的探索与演进

作者:黄昭 阿里ICBU买家增长技术团队 近几年用户增长领域APP推广发展迅猛,而唤端就是其中的重要技术。通过唤端拉新/促活不仅能能够将三方流量规模做大,同时二方流量也能有效利用,给网站不断带来商机,本文将为大家详细…