简单工厂,工厂方法,抽象工厂模式

news2025/7/21 0:44:47

软件设计七大原则

在这里插入图片描述

一、简单工厂(静态工厂方法)

它存在的目的很简单:定义一个创建对象的接口。

组成:

工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻		辑。在java中它往往由一个具体类实现。
抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

在这里插入图片描述

例子

1.抽象产品角色

package simpleFactory;
public interface car {
    void name();
}

2.具体产品角色

package simpleFactory;

public class tesla implements car{
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}
package simpleFactory;

public class wuLing implements car{
    @Override
    public void name() {
        System.out.println("五菱");
    }
}

3.工厂类角色

package simpleFactory;
 
public class carFactory {
    public static car getCar(String car){
        if (car.equals("wuLing")){
            return new wuLing();
        }
        else if (car.equals("tesla")){
            return new tesla();
        }
        else {
            return null;
        }
    }
}

4.顾客测试类

package simpleFactory;
public class consumer {
    public static void main(String[] args) {
        car wuLing = carFactory.getCar("wuLing");
        car tesla = carFactory.getCar("tesla");
 
        wuLing.name();
        tesla.name();
    }
}

优缺点

优点

专门定义一个工厂类负责创建其他类的实例,最大的优点在于工厂类
中包含了必要的逻辑,根据客户需要的条件动态实例化相关的类。

优点

当需要增加一种产品时,比如ProductC就需要修改简单工厂类SimpleFactory(增加if-else块),这违背了开闭原则。

二、工厂方法

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
在这里插入图片描述

例子

//创建工厂接口CarFactory:
 
public interface CarFactory {
    Car createCarFactory();
}//创建具体类型的工厂:
 
public class BenzFactory implements CarFactory {
    @Override
    public Car createCarFactory() {
        return new BiyadiCar();
    }
}public class BiyadiFactory implements CarFactory{
    @Override
    public Car createCarFactory() {
        return new BiyadiCar();
    }
}public class HongqiFactory implements CarFactory{
    @Override
    public Car createCarFactory() {
        return new HongqiCar();
    }
}
​
​
 
//测试
 
    public static void main(String[] args) {
        HongqiFactory hongqiFactory = new HongqiFactory();
        Car carFactory = hongqiFactory.createCarFactory();
        carFactory.createCar();
    }
​
​
​
}
//输出:生产比亚迪

结论:用户只需要知道具体工厂的名字,就可以得到想要的产品。
其满足单一原则,开闭原则,但是灵活性较差。

三、抽象工厂

抽象工厂由抽象工厂,具体工厂,抽象产品和具体产品等4个要素构成 

抽象工厂各个元素的作用

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法
    newProduct(),可以创建多个不同等级的产品。
  2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

结构如下:
在这里插入图片描述

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

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

相关文章

南非醉茄来源的天然产物之活性大盘点

图 1. 南非醉茄 (Withania Somnifera) 的多种药理活性[2] 化学成分 到目前为止,大约有超过 12 种生物碱和 40 多种甾体内脂类化合物从南非醉茄中被分离出来 。其中,醉茄内脂 (Withanolides) 因其广泛的药理活性 (抗肿瘤、抗菌、抗炎和免疫调节活性等) 受…

RabbitMQ系列【9】过期时间

有道无术,术尚可求,有术无道,止于术。 文章目录概念队列过期控制台代码消息过期删除策略概念 TTL全称Time To Live,是指存活时间或过期时间。当消息到达存活时间后,还没有被消费,会被自动清除。 RabbitMQ…

二十六、设置时序电路初始状态的方法(初始值设置)

----------------------------------------------------------------------------------------------------- 该专栏主要介绍用场效应管设计基本电路,由浅到深,从用场效应管设计最基本的非门、与非门、或非门、与门、或门的设计,到用场效应管设计触发,再到用场效应管设计具…

【论文阅读】Combinatorial Benders’ Cuts for the Strip Packing Problem

文章目录一、摘要二、求解条形装箱的Benders分解2.1 Notation2.2 SPP的数学逻辑模型2.3 分解方法三、从问题的解决方案3.1 复杂性分析3.2 y-check的算法3.2.1 预处理过程3.2.1.1 Merge Items 合并项目3.2.1.2 Lift Item Widths 增大项目宽度3.2.1.3 Shrink the Strip 缩小长条容…

实战+代码!Selenium + Phantom JS爬取天天基金数据

功能: 通过程序实现从基金列表页,获取指定页数内所有基金的近一周收益率以及每支基金的详情页链接。再进入每支基金的详情页获取其余的基金信息,将所有获取到的基金详细信息按近6月收益率倒序排列写入一个Excel表格。 思路: 通过…

python-pandas用法大全

目录1 修改 DataFrame 某一列的数据类型2 读取和保存3 特定值的替换4 两个 DataFrame 的连接4.1 join4.2 某列作为拼接的依据5 删除某一列5.1 删除第n列5.2 删除特定名称列6 行、列重排6.1列重排6.2 行重排6.3 根据某一列的值排序6.4 随机打乱所有行7 修改某列的名称7.1 全局修…

m基于自适应门限软切换的3G和Wifi垂直切换算法的matlab仿真

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB预览 4.完整MATLAB程序 1.算法概述 这里还是考虑位置信息和强度联合切换判决的方法,如果你的设备没法提供具体的位置信息的话,那么就把位置信息的权值设置为0。强度判决的权值设置为1即可。 需要传输的数…

外业精灵,在水土流失监测野外调查工作中的应用

常规的水土流失野外调查技术已难以满足现阶段区域水土流失监测工作的需求。 为探索高效、精准、高质量的水土流失数据采集技术,作者以山东沂蒙山泰山国家级重点治理区蒙阴县为例,以小流域或公里网格为调查单元,通过分析外业精灵的技术优势&a…

webpack高级配置

摇树(tree shaking) 我主要是想说摇树失败的原因(tree shaking 失败的原因),先讲下摇树本身效果 什么是摇树? 举个例子 首先 webpack.config.js配置 const webpack require("webpack");/**…

Educational Codeforces Round 138 (Rated for Div. 2)

A:思维 题意:给一定的N*N的板子,里面放有一些乌鸦,这些乌鸦会攻击自己的所在行与所在列,问给定一个数量的乌鸦,问是否能够移动某只乌鸦,使得形成和平局面? 方法:我们发现…

股票涨跌量化怎样进行策略分析?

股票涨跌量化其实是通过Python调用Tushare库计算深证成指实时,对股票的成交量涨跌幅,主要是通过相关分析选择合适的成交量涨跌幅来计算的一种量化策略分析方法,也可以根据绘制股票的成交量涨跌幅度与当日股价的涨跌幅描绘出来。如果我们想快速…

目标检测论文解读复现之八:基于YOLOv5s的滑雪人员检测研究

前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

Unity使用NaveMesh实现第一人称视角移动

系列文章目录 Navemesh寻路系列文章 文章目录 目录 系列文章目录 文章目录 前言 一、NavMeshPath是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 navemesh已经大量使用到游戏中,但大部分寻路都是使用SetDestination函数,给予一个目标…

SpringBoot+Vue项目大学校园防疫与服务系统的设计与实现

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JDK版…

C++初阶 Vector模拟实现

q. > 作者:小萌新 专栏:C初阶 作者简介:大二学生 希望能和大家一起进步 本篇博客介绍:本篇博客会模拟Vector实现 学习目标 模拟默认函数实现模拟迭代器实现模拟容器大小相关函数模拟修改内容相关函数模拟访问容器相关函数 我…

xss挑战之旅11-19关

文章目录前言第11关:referer第12关:User-Agent第13关:cookie第14关:exif xss第15关:ng-include第16关第17关第18关第19关:flash xss前言 靶场:XSS挑战之旅 1-10关 11-20关 第11关:r…

『LeetCode|每日一题』---->颜色填充

目录 1.每日一句 2.作者简介 『LeetCode|每日一题』颜色填充 1.每日一题 2.解题思路 2.1 思路分析(DFS) 2.2 核心代码 2.3 完整代码 2.4 运行结果 1.每日一句 我的宇宙为你藏着无数个星球 2.作者简介 🏡个人主页:XiaoXiaoChe…

Git之路

文章目录指南介绍实战任务一:sb项目任务二:idea实战任务三:分支实战(待续)指南 如果你想在简历上写“会常用的Git的命令“,那么这篇文章值得你要看,那我们需要掌握什么呢?其实会简单的操作就行&#xff0c…

Matplotlib绘图-快速上手可视化工具

Matplotlib快速上手一、初识Matplotlib1.1 认识Matplotlib的图像结构1.2 绘制一个折线图二、给图像添加修饰2.1 自定义x的刻度2.2一图多线2.3一图绘制多个坐标系子图三、主流图形的绘制3.1绘制柱状图一、初识Matplotlib 是Python最常见的可视化工具之一 1.1 认识Matplotlib的…

csrf跨站请求伪造

文章目录csrf跨站请求伪造1、前戏2、csrf校验2.1、from表单如何符合校验2.2、ajax如何符合校验3、csrf相关装饰器FBVCBVcsrf跨站请求伪造 1、前戏 """ 钓鱼网站搭建一个跟正规网站一摸一样的界面(中国银行)用户进入到我们的网站&#x…