4.工厂模式

汽车轮胎动平衡背后的秘密:如何用惯性主轴原理消除方向盘抖动 本文深入解析了汽车轮胎动平衡的核心原理,即利用惯性主轴原理消除高速行驶时的方向盘抖动。文章从方向盘抖动的现象出发,阐释了动不平衡产生的物理本质,并详细介绍了如何通过动平衡机测量、计算与校正,使轮胎-轮毂系统的实际旋转轴回归其惯性主轴,从而实现稳定运转。 阅读详情

4.工厂模式

简单工厂

类图

简单工厂

优缺点

  1. 优点

    简单,解耦。
    
  2. 缺点

    当需要扩充业务时,需要对BaoziFactory进行修改,当废弃某一产品时,也需要修改factory代码,产品过多,可能导致factory代码过长,冗余度高。
    

code

package com.desmond.codebase.designpattern.facotry.simple;

/**
 * 包子.
 * @author presleyli
 * @date 2018/9/18 下午7:35
 */
public interface Baozi {
    void sayHello();
}

package com.desmond.codebase.designpattern.facotry.simple;

/**
 * @author presleyli
 * @date 2018/9/18 下午7:40
 */
public class BeefBaozi implements Baozi {
    @Override
    public void sayHello() {
        System.out.println("I'm beef baozi.");
    }
}

package com.desmond.codebase.designpattern.facotry.simple;

/**
 * @author presleyli
 * @date 2018/9/18 下午7:40
 */
public class PorkBaozi implements Baozi {
    @Override
    public void sayHello() {
        System.out.println("I'm pork baozi.");
    }
}

package com.desmond.codebase.designpattern.facotry.simple;

/**
 * @author presleyli
 * @date 2018/9/18 下午7:41
 */
public class BaoziFactory {
    public static Baozi getBaozi(String name) {
        switch (name) {
            case "beef":
                return new BeefBaozi();
            case "pork":
                return new PorkBaozi();
        }

        return null;
    }
}

package com.desmond.codebase.designpattern.facotry.simple;

/**
 * 如果需要添加其他种类的baozi,
 * 需要修改baoziFactory,
 * 如果要废掉某些baozi,比较麻烦.
 * @author presleyli
 * @date 2018/9/18 下午7:50
 */
public class Test {
    public static void main(String[] args) {
        Baozi baozi = BaoziFactory.getBaozi("beef");
        baozi.sayHello();
    }
}

输出

I'm beef baozi.

工厂方法

类图

工厂方法

优缺点

  1. 优点

    解耦,符合开闭原则,新增业务时,只需要扩展代码即可.
    
  2. 缺点

    稍微有些复杂,新增业务时,需要实现 产品+工厂 两个子类,对应扩充大量业务,需要的类也比较多,一个工厂只生产单一产品,有些浪费
    

code

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * 包子.
 * @author presleyli
 * @date 2018/9/18 下午7:35
 */
public interface Baozi {
    void sayHello();
}

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午7:40
 */
public class BeefBaozi implements Baozi {
    @Override
    public void sayHello() {
        System.out.println("I'm beef baozi.");
    }
}

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午7:40
 */
public class PorkBaozi implements Baozi {
    @Override
    public void sayHello() {
        System.out.println("I'm pork baozi.");
    }
}

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * Created by presleyli on 2018/9/18.
 */
public interface BaoziFactory {
    Baozi createBaozi();
}

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午8:52
 */
public class BeefBaoziFactory implements BaoziFactory{
    @Override
    public Baozi createBaozi() {
        return new BeefBaozi();
    }
}

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午8:53
 */
public class PorkBaoziFactory implements BaoziFactory {
    @Override
    public Baozi createBaozi() {
        return new PorkBaozi();
    }
}

package com.desmond.codebase.designpattern.facotry.factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午8:53
 */
public class Test {
    public static void main(String[] args) {
        BaoziFactory baoziFactory = new BeefBaoziFactory();
        Baozi baozi = baoziFactory.createBaozi();

        baozi.sayHello();

        baoziFactory = new PorkBaoziFactory();
        baozi = baoziFactory.createBaozi();

        baozi.sayHello();
    }
}

输出

I'm beef baozi.
I'm pork baozi.
    

抽象工厂

类图

抽象工厂

优缺点

  1. 优点

    对工厂方法进一步抽象,可以针对某一产品族进行抽象,比如 工厂A, 既可以生产 牛肉、卷芯菜的包子,而非单一牛肉馅得包子
    
  2. 缺点

    复杂度高,目前我还未用到此类模式
    

code

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * Created by presleyli on 2018/9/18.
 */
public interface Meet {
    String getName();
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:51
 */
public class Pork implements Meet{
    @Override
    public String getName() {
        String name = "I'm pork...";

        System.out.println(name);

        return name;
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:51
 */
public class Beef implements Meet{
    @Override
    public String getName() {
        String name = "I'm beef...";

        System.out.println(name);

        return name;
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * Created by presleyli on 2018/9/18.
 */
public interface Vegetables {
    String getName();
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:52
 */
public class Cabbage implements Vegetables{
    @Override
    public String getName() {
        String name = "I'm cabbage...";

        System.out.println(name);

        return name;
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:52
 */
public class GreenPepper implements Vegetables{
    @Override
    public String getName() {
        String name = "I'm green pepper...";

        System.out.println(name);

        return name;
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * Created by presleyli on 2018/9/18.
 */
public interface IntegrationCreator {
    Meet getMeet();
    Vegetables getVegetables();
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:56
 */
public class InterationCreator1 implements IntegrationCreator{
    @Override
    public Meet getMeet() {
        return new Pork();
    }

    @Override
    public Vegetables getVegetables() {
        return new Cabbage();
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:56
 */
public class InterationCreator2 implements IntegrationCreator{
    @Override
    public Meet getMeet() {
        return new Pork();
    }

    @Override
    public Vegetables getVegetables() {
        return new GreenPepper();
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:56
 */
public class InterationCreator3 implements IntegrationCreator{
    @Override
    public Meet getMeet() {
        return new Beef();
    }

    @Override
    public Vegetables getVegetables() {
        return new GreenPepper();
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

import lombok.Data;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:54
 */
public class Baozi {
    private Vegetables vegetables;
    private Meet meet;

    private IntegrationCreator creator;

    public Baozi() {
    }

    public Baozi(IntegrationCreator creator) {
        this.creator = creator;
    }

    public void prepare() {
        System.out.println("preparing...");

        this.vegetables = creator.getVegetables();
        this.meet = creator.getMeet();
    }

    public void makeBaozi() {
        System.out.println("starting to making bao zi...");
        this.vegetables.getName();
        this.meet.getName();
    }

    public Vegetables getVegetables() {
        return vegetables;
    }

    public void setVegetables(Vegetables vegetables) {
        this.vegetables = vegetables;
    }

    public Meet getMeet() {
        return meet;
    }

    public void setMeet(Meet meet) {
        this.meet = meet;
    }

    public IntegrationCreator getCreator() {
        return creator;
    }

    public void setCreator(IntegrationCreator creator) {
        this.creator = creator;
    }
}

package com.desmond.codebase.designpattern.facotry.abstract_factory;

/**
 * @author presleyli
 * @date 2018/9/18 下午9:57
 */
public class Test {
    public static void main(String[] args) {
        Baozi baozi = new Baozi();
        baozi.setCreator(new InterationCreator1());

        baozi.prepare();
        baozi.makeBaozi();

        // 2nd
        System.out.println("2nd");

        baozi.setCreator(new InterationCreator2());

        baozi.prepare();
        baozi.makeBaozi();

        // 3rd
        System.out.println("3rd");
        baozi.setCreator(new InterationCreator3());

        baozi.prepare();
        baozi.makeBaozi();
    }
}

输出

preparing...
starting to making bao zi...
I'm cabbage...
I'm pork...
2nd
preparing...
starting to making bao zi...
I'm green pepper...
I'm pork...
3rd
preparing...
starting to making bao zi...
I'm green pepper...
I'm beef...
Oracle EBS Interface/API(42) -AP发票客制化付款申请 背景 在OA系统上,选择Oracle EBS的某张AP发票做付款申请,需要类似于锁定该发票以便付款,其他用户或者下次用户不能再次选择该发票做付款申请。 快速参考 参考点 内容 功能导航 N: AP->Invoices->Entry>Invoices 并发请求 None 基表 AP.AP_INV_SELECTION_CRITERIA_ALLAP.AP_SELECTED_INVOICES_ALL API 参考下面介绍 错误信息表 None 接口Form 阅读详情

相关推荐

实战|验证码突破思路

漏洞成因:由于逻辑设计缺陷,可绕过验证,比如直接删除COOKIE或验证码参数可绕过、当验证不通过清空session时,验证码参数值为空时绕过等。测试方法:抓包,删除验证码字段,查看是否可以成功发送抓包,正常流程下,记录验证码后的数据包,替换目标包中内容,直接发送,查看是否可以直接绕过验证码案例:Step1.输入正确账户信息和错误验证码,登录时抓包Step2.删除COOKIEStep3.客户端登陆成功。

weixin_46239998的博客 8106

设计模式系列之 工厂模式

介绍 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 主要解决:主要解决接口选择的问题。 何时使用:我们明确地计划不同条件下创建不同实例时。 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。 关键代码:创建过程在其子类执行。 应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以...

灯塔的优快云博客 1193

欧姆龙OMRON PLC之HostLink通讯协议(四)-FINS命令进阶应用与调试技巧

本文深入探讨欧姆龙OMRON PLC的HostLink通讯协议中FINS命令的进阶应用与调试技巧。文章聚焦实战排错,详细解析命令帧解剖、响应帧解读与网络抓包三大核心方法,并分享性能优化策略,如合并读写与异步设计。同时介绍了强制操作、多存储区访问等高级命令的应用场景,旨在帮助工程师高效解决现场通讯问题,提升系统稳定性与效率。

nept的博客 751

PetShop4.0架构分析及工厂模式的使用

最近几天一直在看Mirosoft发布的PetShop4.0,主要研究了一下其中对于反射工厂的使用以及架构的设计,感觉有所得,特记下本文与大家分享,不到之处欢迎拍砖。PetShop4.0中对于工厂模式进行了非常经典的使用,其中主要是一下类的工程配合使用,构成数据访问工厂:1  IDAL层:主要负责对于数据访问层进行接口的定义,模块中相应的方法全部在这一层中进行声明。2  DAL层:继承I

我就是停不下来 1040

CISP-PTE八套真题详解(侵删)_cisp-pte 考题与答案,万字长文轻松彻底入门Flutter

接下来就是代码审计了isset()函数用于检测变量是否已设置并且非 NULL代码中base64解码出来是一个base64的一句话木马根据代码,需要我们提交一个Hello参数,参数的值为多少都行,然后我们可以通过提交z0参数的base64值进行执行命令先用phpinfo();试一下:发现执行成功那么直接写个查看key文件的系统命令(记得最后要加分号)在源代码中找到key。

2401_83947398的博客 4675

通信工程学习:什么是ASK振幅键控、FSK频移键控、PSK相移键控

ASK、FSK和PSK是三种基础数字调制技术。ASK通过改变载波振幅传输信息,实现简单但抗干扰弱;FSK利用频率变化传递信号,抗干扰较强但频谱利用率一般;PSK通过相位变化编码数据,抗干扰和频谱效率最优但同步要求高。三种技术各具特点,分别适用于不同通信场景:ASK用于低速光纤通信,FSK常见于无线广播,PSK则广泛应用于Wi-Fi、蓝牙等现代通信系统。

limengshi138392的博客 8727

《Head First 设计模式·4工厂模式》评价

近期整合静态工厂、工厂方法和抽象工厂模式。因为我很厌恶DIP,所以仔细看了一下《Head First 设计模式·4工厂模式》。 一个字评价烂,两个字,超级烂。 这本书的行文风格,各有喜好,我不评价——虽然我不喜欢花里胡哨的插图等。我们看其内容。 不应该用new,这节没有问题。《识别变化的方面》给出一个很烂的例子。PizzaStore与Pizza。抽象类Pizza有一系列子类型如CheeseP...

yqj2065的博客 918

Windows 11 上 WSL2 安装 Ubuntu 22.04 保姆级教程(含桌面环境配置)

本文提供在Windows 11上通过WSL2安装Ubuntu 22.04并配置桌面环境的详细教程。涵盖WSL2核心安装、性能调优、Xfce桌面环境部署以及开发环境集成,帮助开发者构建高效、无缝的Windows-Linux混合开发工作站。

Jerry的专栏 634

设计模式之4种工厂模式总结

友情链接: 设计模式之简单/静态工厂模式设计模式之工厂方法模式设计模式之抽象工厂模式设计模式之建造者模式 ------------------------------ 工厂模式总结 工厂模式设计原则与设计目的 1、解耦, 2、工厂负责对象的创建 3、面向接口编程,程序员只管使用,直至其接口而不知其实现类 工厂模式对比: 简单/静态工厂模式:把所有对象的创建逻辑集中到一个(专业)类处...

小明的Java问道之路 4514

Python 中调用 R 语言的教程(包含编码问题解决办法)

rpy2 是一个 Python 库,允许在 Python 中直接运行 R 代码并实现数据转换。安装需确保 Python 和 R 环境正确配置,Windows 用户需注意编码问题(GBK 错误可通过控制面板调整区域设置解决)。基本用法包括执行 R 代码、传递数据(支持 Python 与 R 数据类型自动转换)以及调用 R 包函数。通过 robjects.r() 执行 R 代码,使用 pandas2ri 转换器处理 DataFrame 数据交换,并支持像导入 Python 模块一样加载 R 包(如 import

zygalaxy的博客 995

Visual Studio Installer下载失败的5种修复方法(含DNS修改/补丁安装)

本文针对Visual Studio Installer下载安装文件失败的问题,提供了从网络层到系统层的深度排查与修复指南。详细介绍了DNS修改、代理配置、防火墙设置、系统服务检查等5种核心修复方法,并包含离线安装与手动补丁等替代方案,帮助开发者彻底解决安装难题。

sprite的博客 1619

Petshop4.0之简单工厂模式

Petshop4.0之简单工厂模式  抽象工厂模式是一种创建模式,用于当需要时返回一系列相关类中的某一个,而每一个类都能根据需要返回不同的对象时使用。它可以快速得创建产品实例,使提升了应用程序的可扩展性,减少模块之间的耦合。        抽象工厂模式包括4种对象。(1)抽象工厂接口或类,它的创建与应用程序业务逻辑无关,通常使用接口或者抽象类实现。(2)具体工厂类,它们的创建与业务逻辑有着密切

坚持,才是力量.老实做人,踏实做事. 682

2026滑块验证码终极实战:缺口检测算法+人机轨迹模拟,识别率从60%飙升至95%全方案

**摘要:2026年AIGC技术发展导致传统验证码失效,滑块验证码成为主流防护手段。本文深入分析了传统方案识别率低的原因,并提出多级检测融合和行为拟合优化方案。通过图像预处理优化、三级缺口检测引擎(差分图像法、Hu矩轮廓匹配、YOLOv8n模型兜底)将识别率提升至99.2%。同时针对轨迹模拟环节,设计了包含抖动特征、时间随机性和个体差异的行为模型,使通过率从12%提升至87%。该方案解决了传统方法在缺口定位精度和轨迹真实性方面的核心痛点,为应对新一代验证码风控提供了完整的技术框架。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1902

4 工厂模式

工厂模式介绍

weixin_43643617的博客 147

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

4工厂模式

文章目录工厂模式1.1简单工厂模式(静态工厂模式)1.2 工厂方法模式1.3抽象工厂模式 工厂模式 作用: 实现了创建者和调用者的分离 详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 1.1简单工厂模式(静态工厂模式) 1先建立汽车抽象类 public interface Car { void name(); } 2 制造车 制造“五凌”车 public class WuLi...

Insist___的博客 236

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

设计模式4——工厂模式

如果饿了就吃,困了就睡,渴了就喝,人生就太无趣了 1.简单工厂模式 简单工厂模式并不是一个设计模式,反而是一种编程习惯。简单工厂模式就是将某种类的初始化全部交给工厂来执行,外部用户不用考虑内部的实现,只需要告诉工厂想要什么样就可以,工厂根据用户提供的信息,返回一个相应类的实例。 如图1,一个实现简单工厂模式的pizza店。 (1)Pizza是一个接口,有四种不同的pizza实现接口。 (2)...

可耳(keer)的博客 757

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

HeadFirst 设计模式学习笔记4--工厂模式

本文已搬家至【HeadFirst 设计模式学习笔记】4 工厂模式

gnuhpc的专栏 3620

工厂模式(工厂模式4)

工厂模式:工厂模式 提示:在实际工作中更偏向使用简单工厂模式, 相对于简单工厂模式,我们要再建一个工厂接口,对于其他要实现的的类都实现这个接口, 创建一个实现类的工厂(public class AudiCarFactory implements CarFactory ){} 通过这个实现类工厂来创建我们要的实现类   //添加工厂实现类,方便添加新的类,如果要创建一个BydCar,

chbxw 314

【设计模式总结】4、工厂模式——简单工厂

开始之前,必须得注明一下,简单工厂并不是设计模式,它是一种编程习惯,方便后续引入工厂方法模式和抽象工厂模式。 简单工厂: 简单工厂非常简单,就是将所有类型实例化封装成一个类,用于解决使用new很多,违背了针对接口编程设计原则的问题,这也是工厂模式的设计原因之一。 UML类图: Clien通过SimpleProductFactory取得Product实例。 SimpleProductFactory...

Alexander的博客 159

浅析对PetShop4.0的工厂模式的理解

最近几天在看被传为经典的PetShop4.0,感觉收获还是挺大

u013240481的专栏 805
上一篇: 随手记-焦虑
下一篇: 5.Spring Bean生命周期.md
desmond_assis
博客等级 码龄14年 33粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值