工厂模式~

news2024/11/17 6:35:56

核心本质
① 实例化对象不使用new,用工厂方法代替
② 将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦

简单工厂

在这里插入图片描述

public interface Car {
    void name();
}
public class Tesla implements Car{
    @Override
    public void name() {
        System.out.println("特斯拉!");
    }
}
public class WuLing implements Car{
    @Override
    public void name() {
        System.out.println("五菱宏光!");
    }
}
public class CarFactory {
    public static Car getCar(String car){
        if (car.equals("五菱")){
            return new WuLing();
        } else if (car.equals("特斯拉")) {
            return new Tesla();
        }else {
            return null;
        }
    }
}
public class Consumer {
    public static void main(String[] args) {
        Car car = CarFactory.getCar("特斯拉");
        car.name();
    }
}

但是简单工厂模式我们如果还想添加车(新的类)就只能去动代码逻辑,违反了开闭原则。

工厂方法模式

在这里插入图片描述

工厂方法模式就可以不用动逻辑代码,思想就是为每个车都创建一个工厂,当我们需要添加新车时,需要为其创建一个工厂并实现公共工厂即可,也就不需要再去动代码

public interface Car {
    void name();
}
public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉!");
    }
}
public class WuLing implements Car {
    @Override
    public void name() {
        System.out.println("五菱宏光!");
    }
}
public interface CarFactory {
    Car getCar();
}
public class WuLingFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new WuLing();
    }
}
public class TeslaFactory implements CarFactory{
    @Override
    public  Car getCar() {
        return new Tesla();
    }
}
public class Consumer {
    public static void main(String[] args) {
        Car car = new WuLingFactory().getCar();
        Car car1 = new TeslaFactory().getCar();
        car.name();
        car1.name();
    }
}

但是工厂方法模式每添加新车都会增加两个类,所以从结构、代码、管理的复杂度上来说都是简单工厂模式方便一点

抽象工厂模式

在这里插入图片描述

在工厂方法模式中,我们使用一个工厂创建一个产品,一个具体工厂对应一个具体产品,但有时候我们需要一个工厂能够提供多个产品对象,而不是单一的对象,这个时候我们就需要使用抽象工厂模式。围绕一个超级工厂创建其他工厂,该超级工厂又被称为其他工厂的工厂,就相当于在超级工厂接口和具体产品实现工厂类之间套了一层生产不同种类的产品的接口横向扩展了一哈

超级工厂

public interface IProductFactory {
//生产手机
IphoneProduct iphoneProduct();

//生产路由器
IRouterProduct routerProduct();
}

public interface IphoneProduct {
    void start();
    void shutdown();
    void callup();
    void sendSMS();
}
public interface IRouterProduct {
    void start();
    void shutdown();
    void openWifi();
    void setting();
}
public class XiaomiFactory implements IProductFactory{
    @Override
    public IphoneProduct iphoneProduct() {
        return new XiaoMiPhone();
    }

    @Override
    public IRouterProduct routerProduct() {
        return new XiaoMiRouter();
    }
}
public class HuaweiFactory implements IProductFactory{
    @Override
    public IphoneProduct iphoneProduct() {
        return new HuaWeiPhone();
    }

    @Override
    public IRouterProduct routerProduct() {
        return new HuaWeiRouter();
    }
}
public class XiaoMiPhone implements IphoneProduct{
    @Override
    public void start() {
        System.out.println("小米手机开机!");
    }

    @Override
    public void shutdown() {
        System.out.println("小米手机关机!");
    }

    @Override
    public void callup() {
        System.out.println("小米手机打电话!");
    }

    @Override
    public void sendSMS() {
        System.out.println("小米手机发消息!");
    }
}
public class XiaoMiRouter implements IRouterProduct {
    @Override
    public void start() {
        System.out.println("启动小米路由器!");
    }

    @Override
    public void shutdown() {
        System.out.println("关闭小米路由器!");
    }

    @Override
    public void openWifi() {
        System.out.println("启动小米路由器Wifi!");
    }

    @Override
    public void setting() {
        System.out.println("启动小米路由器设置!");
    }
}
public class HuaWeiPhone implements IphoneProduct{
    @Override
    public void start() {
        System.out.println("华为开机!");
    }

    @Override
    public void shutdown() {
        System.out.println("华为关机!");
    }

    @Override
    public void callup() {
        System.out.println("华为打电话!");
    }

    @Override
    public void sendSMS() {
        System.out.println("华为发信息!");
    }
}
public class HuaWeiRouter implements IRouterProduct{
    @Override
    public void start() {
        System.out.println("启动HUAWEI路由器!");
    }

    @Override
    public void shutdown() {
        System.out.println("关闭HUAWEI路由器!");
    }

    @Override
    public void openWifi() {
        System.out.println("启动HUAWEI路由器Wifi!");
    }

    @Override
    public void setting() {
        System.out.println("启动HUAWEI路由器设置!");
    }
}

public class Client {
    public static void main(String[] args) {
        System.out.println("===================小米系列===================");

        XiaomiFactory xiaomiFactory = new XiaomiFactory();
        IphoneProduct iphoneProductXiaomi = xiaomiFactory.iphoneProduct();
        iphoneProductXiaomi.start();
        iphoneProductXiaomi.callup();

        IRouterProduct iRouterProductXiaomi = xiaomiFactory.routerProduct();
        iRouterProductXiaomi.start();

        System.out.println("===================华为系列===================");

        HuaweiFactory huaweiFactory = new HuaweiFactory();
        IphoneProduct iphoneProductHuawei = huaweiFactory.iphoneProduct();
        iphoneProductHuawei.start();
        iphoneProductHuawei.callup();

        IRouterProduct iRouterProductHuawei = xiaomiFactory.routerProduct();
        iRouterProductHuawei.start();
    }
}

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

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

相关文章

基于 opencv 的人脸识别上课考勤系统,附源码,可作为毕业设计

一、简介 这个人脸识别考勤签到系统是基于大佬的人脸识别陌生人报警系统二次开发的。 项目使用Python实现,基于OpenCV框架进行人脸识别和摄像头硬件调用,同时也用OpenCV工具包处理图片。交互界面使用pyqt5实现。 该系统实现了从学生信息输入、人脸数据…

ps复制图层警告 (不能从选区建立新图层,因为所选区域是空的。)解决方法

有时我们选完选区 按 CtrlJ 复制图层 会出现这种情况 问题出在你当前选的图层 因为 我选择的这块选区在第二个图层上 但很明显 选择的是一大个图层 简单说 你操作的选区必须在你当前选择的图层上才行 也就是 我现在要将选择区换成第二个图层才行 再按 CtrlJ 图层就出来了

AssetStudio工程导入VS各种报错解决

AssetStudio下载地址:https://github.com/Perfare/AssetStudio 工程导入,生成解决方案,然后报了一堆错。让我们来一个一个的解决 这个错误,是缺少System.Runtime.InteropServices.RuntimeInformation.dll文件,下载并添…

“爱心助考 为梦护航”雷锋志愿者在行动

为确保我市高考、学考工作顺利进行,为考生营造安全温馨的考试环境保驾护航,共青团怀化市委、市教育局、共青团鹤城区委、区教育局联合怀化市青少年关爱协会党支部,开展2023“爱心助考 为梦护航”雷锋志愿者服务活动。 6月7-9日高考三天&#…

开发新项目看过来,这3款基于 Vue 的免费开源的 admin 管理后台框架非常好用

三款 admin 框架,分别基于热门的前端 UI 组件库 ElementPlus / Ant Design / Naive UI 打造,开箱即用。 新项目的开始,一般是搭建 admin 系统,今天盘点一下3个好的选择。 Vue vben admin 了解详细:https://www.thos…

C型标准气动阀线圈插头安装距8mm

8mm针脚距气动阀插头、C型DIN标准电气插头。这些插头通常用于工业自动化、机械控制等领域。 工业标准,C型,DIN43650 / EN175301-803,插针中心距 8mm、3针脚、4针脚,额定电压 250V,工作电流 6A,最大接线 0.75mm2,电缆锁紧口 PG7,电缆外径 4-6…

Beyond Compare 4 无法打开

解决办法: 1.修改注册表。WINR呼出开始菜单,在搜索栏中输入 regedit,点击确定。 2.删除项目:\HKEY_CURRENT_USER\Software\ScooterSoftware\Beyond Compare 4\CacheId 根据这个路径找到cacheid 右击删除掉就可以

Allegro Design Entry CIS导出原理图BOM方法

1.Allegro Design Entry CIS导出原理图BOM方法 Tools->Bill of Materials 填入项分别为: Header:项次\t名称\t位号\t值\t封装\t数量 Combined property string: {Item}\t{PartName}\t{Reference}\t{Value}\t{PCB footprint}\t{Quantity} 点击OK生成如下表格

服务架构的进化之路:探索服务架构的演进之路

1、引言 服务架构是一种以服务为中心的软件设计模式,将应用程序拆分为一组小而自治的服务单元。随着互联网和信息技术的快速发展,软件系统变得越来越复杂。为了应对这种变化,服务架构也在不断地演变和发展。本文将简要介绍服务架构的发展史&…

基于BG/NBD概率模型的用户CLV预测

基于BG/NBD概率模型的用户CLV预测 小P:小H,我们最近想预测下用户的生命周期价值,有没有什么好的方法啊? 小H:简单啊, C L V 用户每月平均花费 ∗ 用户平均寿命 CLV用户每月平均花费*用户平均寿命 CLV用户每…

Masked Autoencoders As Spatiotemporal Learners

Masked Autoencoders As Spatiotemporal Learners 文章目录 Masked Autoencoders As Spatiotemporal Learners一、文章背景二、文章变量1 mask sampling 方式2 Mask ratio3 其余的ablation studies 一、文章背景 用于视频中的时间信息学习。 基本思想是重构,使用的…

bilibili记录

霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频 目标检测篇github地址;GitHub - WZMIAOMIAO/deep-learning-for-image-processing: deep learning for image processing including classification and object-detection etc.

mapbox分屏地图同步缩放拖拽旋转

成果图 之前写过一版,后来又经过一些优化,形成了现在的最终版本,之前是二维的,现在是三维的也可以了,地址在这儿 https://blog.csdn.net/Sakura1998gis/article/details/113175905 实现 监听动作 // 拖拽同步map.on(d…

pm3包1.8版本发布----一个用于3组倾向性评分的R包

目前,本人写的第二个R包pm3包的1.8版本已经正式在CRAN上线,用于3组倾向评分匹配,只能3组不能多也不能少。 可以使用以下代码安装 install.packages("pm3")什么是倾向性评分匹配?倾向评分匹配(Propensity Sc…

经常被问道的这些类,佬们能够吊打面试官嘛(适合秋招和小白系列)?

前言: 本篇文章主要讲解Java中的几个类常被问到的面试题相关知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~ 小威在此先感谢各位小伙伴儿了😁 以…

宏病毒组研究大放异彩!| 凌恩生物1-5月高分宏病毒组文章大盘点!

凌恩生物现已在宏组学、基因组、表观遗传以及蛋白代谢等多组学及联合分析领域积累了深厚经验,打造出成熟的科研服务平台,以优质售前方案和优秀售后服务助力客户在Nature、Science、PNAS、ISME和MIcrobiome等高端国际期刊上发表了大量文章。 伴随着组学技…

【DevOps】Python+Golang(一)

Python is和的区别 is检查两个对象是否是同一个对象,即它们的内存地址是否相同。如果是同一个对象,则返回True,否则返回False。 检查两个对象是否相等,即它们的值是否相同。如果值相同,则返回True,否则返回…

Maven-基础

Maven Maven是专门用于管理和构建Java项目的工具,主要功能有: 提供了一套标准化的项目结构 Maven提供了一套标准化的项目结构,所有的IDE使用Maven构建的项目完全一样 提供了一套标准化的构建流程(编译,测试&#xff0c…

jmeter性能测试进阶使用纪要

目录 目录 随机变量:实现注册手机号不重复分配 正则表达式:token等变量提取 HTTP header manager:token传参Authorization使用 后置BeanShell PostProcessor设置prev.setDataEncoding(“utf-8”):响应中文乱码处理 同步定时…

与AI合作穿越剧 编剧徐婷:AI脑洞大,但无法替代人类的情感表达

热门喜剧秀《周六夜现场》本季提前结束,美剧《亿万》最新第七季的更新搁浅,漫威新电影《新刀锋战士》暂停拍摄……美国影视娱乐行业的编剧们以抵制AI为由的大罢工,开始影响诸多作品的产出,据说造成了100亿美元的损失。 这场罢工已…