设计模式-03工厂模式

Android Qcom USB Driver学习(十三) 该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) Android Qcom USB Driver学习(八) Android Qcom USB Driver学习(九)deals with the USB Power Delivery resources used by one or more ports on the basis of the local device policy the basis of the local device policy.opera 阅读详情

工厂模式

简单工厂

实例化对象的时候不再使用new Object()的方式,可以根据用户的选择条件来实例化相关的类,对于客户端来说,去除了具体类的依赖。只需要给出具体实例的描述给工厂,工厂就会自动返回具体的实例对象
在这里插入图片描述

public interface Operation {
    Double getResult(Double a, Double b);
}

新增操作实例类

public class AddClass implements Operation {
    @Override
    public Double getResult(Double a, Double b) {
        return a + b;
    }
}

减法操作实例类

public class SubClass implements Operation {
    @Override
    public Double getResult(Double a, Double b) {
        return a - b;
    }
}

乘法操作实例类

public class MultiplicationClass implements Operation {
    @Override
    public Double getResult(Double a, Double b) {
        return a * b;
    }
}

除法操作实例类

public class DivisionClass implements Operation {
    @Override
    public Double getResult(Double a, Double b) {
        if(b == 0){
            return null;
        }
        return a / b;
    }
}

简单工厂,生产具体实例

public class SimpleFactory {

    public static Operation createOperate(String type){
        Operation operation =null;
        switch (type){
            case "+" :
                operation = new AddClass();
                break;
            case "-":
                operation = new SubClass();
                break;
            case "/":
                operation = new DivisionClass();
                break;
            case "*":
                operation = new MultiplicationClass();
                break;
        }
        return operation;
    }
}

消费方

public class Client {

    public static void main(String[] args) {
        Operation add = SimpleFactory.createOperate("+");
        Operation sub = SimpleFactory.createOperate("-");
        Operation division = SimpleFactory.createOperate("/");
        Operation multiplication = SimpleFactory.createOperate("*");

        System.out.println(add.getResult(2d,3d));
        System.out.println(sub.getResult(2d,3d));
        System.out.println(division.getResult(2d,3d));
        System.out.println(multiplication.getResult(2d,3d));
    }
}

优点:比较好了解,简单易操作。达到了解耦的作用,使用方不用考虑实例对象的内部具体细节,使用方通过简单工厂获取自己需要的实例对象。

缺点:违反了设计模式的OCP原则,即对扩展开发,对修改关闭。即我们给类增加新的功能的时候,尽量不修改代码,或者少修改代码。比如:当我新增新的运算操作时,需要修改简单工厂。

工厂方法

和简单工厂相比,工厂方法进一步解耦,把简单工厂进一步抽象出来一个工厂接口,由具体工厂来实现实例对象的生产,不用关注具体的细节
在这里插入图片描述
新增工厂接口

public interface Factory {
    Operation createOperation();
}

各种操作的具体工厂

public class AddFactory implements Factory {
    @Override
    public Operation createOperation() {
        System.out.println("加法运算");
        return new AddClass();
    }
}

public class SubFactory implements Factory{
    @Override
    public Operation createOperation() {
        System.out.println("减法运算");
        return new SubClass();
    }
}

public class MultiplicationFactory implements Factory {
    @Override
    public Operation createOperation() {
        System.out.println("乘法运算");
        return new MultiplicationClass();
    }
}


public class DivisionFactory implements Factory {
    @Override
    public Operation createOperation() {
        System.out.println("除法运算");
        return new DivisionClass();
    }
}

产品管理接口

public interface Operation {
    Double getResult(Double a, Double b);
}

各种产品类

public class AddClass implements Operation {
    @Override
    public Double getResult(Double a, Double b) {
        return a + b;
    }
}

public class SubClass implements Operation {
    @Override
    public Double getResult(Double a, Double b) {
        return a - b;
    }
}

public class MultiplicationClass implements Operation {
    @Override
    public Double getResult(Double a, Double b) {
        return a * b;
    }
}

public class DivisionClass implements Operation {
    @Override
    public Double getResult(Double a, Double b) {
        if(b == 0){
            return null;
        }
        return a / b;
    }
}

使用方

//方式一:直接通过创建具体工厂使用接口
public class Client {

    public static void main(String[] args) {
        Factory add = new AddFactory();
        Factory sub = new SubFactory();
        Factory division = new DivisionFactory();
        Factory multi = new MultiplicationFactory();

        System.out.println(add.createOperation().getResult(2d,3d));
        System.out.println(sub.createOperation().getResult(2d,3d));
        System.out.println(division.createOperation().getResult(2d,3d));
        System.out.println(multi.createOperation().getResult(2d,3d));
    }
}
//方式二:通过配置文件中的类全路径通过反射机制获取具体工厂
public class Client {

    public static void main(String[] args)throws Exception {
        /*Factory add = new AddFactory();
        Factory sub = new SubFactory();
        Factory division = new DivisionFactory();
        Factory multi = new MultiplicationFactory();*/


        Factory add = (Factory) Class.forName("com.h3c.com.designpattrn.factory.factorymethod.AddFactory").newInstance();
        Factory sub = (Factory) Class.forName("com.h3c.com.designpattrn.factory.factorymethod.SubFactory").newInstance();
        Factory division = (Factory) Class.forName("com.h3c.com.designpattrn.factory.factorymethod.MultiplicationFactory").newInstance();
        Factory multi = (Factory) Class.forName("com.h3c.com.designpattrn.factory.factorymethod.DivisionFactory").newInstance();
        System.out.println(add.createOperation().getResult(2d,3d));
        System.out.println(sub.createOperation().getResult(2d,3d));
        System.out.println(division.createOperation().getResult(2d,3d));
        System.out.println(multi.createOperation().getResult(2d,3d));
    }
}

总结:

工厂模式中,要增加产品类时也要相应地增加工厂类,客户端的代码也增加了不少。工厂方法把简单工厂的内部逻辑判断转移到了客户端代码来进行。

你想要加功能,本来是改工厂类的,而现在是修改客户端。而且各个不同功能的实例对象的创建代码,也没有耦合在同一个工厂类里,这也是工厂方法模式对简单工厂模式解耦的一个体现。工厂方法模式克服了简单工厂会违背开-闭原则的缺点,又保持了封装对象创建过程的优点。

但工厂方法模式的缺点是每增加一个产品类,就需要增加一个对应的工厂类,增加了额外的开发量。

抽象工厂

在这里插入图片描述
产品接口(抽象出产品有哪些共同的操作)

public interface ILogin {
    void insert(Login login);

    Login getLogin(int id);
}

public interface IUser {
    void insert(User user);

    User getUser(int uid);
}

产品类

public class User {

    private int uid;
    private String uname;

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

}

public class Login {

    private int id;
    private Date date;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

产品分类(具体产品分类有哪些操作)

public class MysqlUser implements IUser {
    @Override
    public void insert(User user) {
        System.out.println("在mysql中的user表中插入一条元素");
    }

    @Override
    public User getUser(int uid) {
        System.out.println("在mysql中的user表得到uid为"+uid+"的一条数据");
        return null;
    }
}

public class MysqlLogin implements ILogin {
    @Override
    public void insert(Login login) {
        System.out.println("对 MySQL 里的 Login 表插入了一条数据");
    }

    @Override
    public Login getLogin(int id) {
        System.out.println("通过 uid 在 MySQL 里的 Login 表得到了一条数据");
        return null;
    }
}



public class OracleUser implements IUser {
    @Override
    public void insert(User user) {
        System.out.println("在oracle中的user表中插入一条元素");
    }

    @Override
    public User getUser(int uid) {
        System.out.println("在oracle中的user表得到id为"+uid+"的一条数据");
        return null;
    }
}

public class OracleLogin implements ILogin {
    @Override
    public void insert(Login login) {
        System.out.println("对 Oracle 里的 Login 表插入了一条数据");
    }

    @Override
    public Login getLogin(int id) {
        System.out.println("通过 uid 在 Oracle 里的 Login 表得到了一条数据");
        return null;
    }
}

抽象工厂(定义了抽象工厂,管理工厂有哪些需要共同的操作)

public interface Factory {

    IUser createUser();
    ILogin createLogin();
}

具体工厂(每种产品的具体工厂生产)

public class MysqlFactory implements Factory {
    @Override
    public IUser createUser() {
        return new MysqlUser();
    }

    @Override
    public ILogin createLogin() {
        return new MysqlLogin();
    }
}


public class OracleFactory implements Factory {
    @Override
    public IUser createUser() {
        return new OracleUser();
    }

    @Override
    public ILogin createLogin() {
        return new OracleLogin();
    }
}

使用方(使用方只通过一个具体的工厂就可以获取到对应的实例对象)

public class Client {

    public static void main(String[] args) {
        User user=new User();
        Login login = new Login();

        Factory factory = new OracleFactory();
        IUser iUser = factory.createUser();

        iUser.getUser(1);
        iUser.insert(user);


        ILogin iLogin = factory.createLogin();

        iLogin.getLogin(1);
        iLogin.insert(login);

    }
}

抽象工厂与工厂方法模式的区别在于:抽象工厂是可以生产多个产品的,例如 MysqlFactory 里可以生产 MysqlUser 以及 MysqlLogin 两个产品,而这两个产品又是属于一个系列的,因为它们都是属于MySQL数据库的表。而工厂方法模式则只能生产一个产品,例如之前的 MysqlFactory 里就只可以生产一个 MysqlUser 产品

优点:抽象工厂模式最大的好处是易于交换产品系列,由于具体工厂类,例如 IFactory factory=new OracleFactory();,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易;抽象工厂模式的另一个好处就是它让具体的创建实例过程与客户端分离

缺点:如果你的需求来自增加功能,比如增加Login表,就有点太烦了。首先需要增加 ILogin,mysqlLogin,oracleLogin。 然后我们还要去修改工厂类: sqlFactory, mysqlFactory, oracleFactory 才可以实现,需要修改三个类,实在是有点麻烦

【华为OD机试真题 2025C卷】238、贪吃蛇 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 【华为OD机试真题 2025C卷】238、贪吃蛇 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为od, 阅读详情

相关推荐

SLAM算法的优缺点

SLAM(Simultaneous Localization and Mapping,同时定位与地图构建)算法是一种通过传感器数据实时估计机器人自身位置和构建环境地图的技术。

selenia8860的博客 2905

03 设计模式之工厂模式

工厂方法一般是创建单个类的实例,或者没有内在联系的类的实例。而且抽象工厂一般是创建有关联,或者相互依赖的类的实例,可以理解为生产产品簇的工厂。抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的实现类。AbstractFactory:抽象工厂,定义约束创建一系列产品对象的操作接口。ConcreteFactory:抽象工厂的具体实现类,负责一系列有相互关系的类的对象的创建。AbstractProduct:定义一系列产品对象的接口。

2401_89191733的博客 950

傻白入门芯片设计,SystemVerilog Assertion(SVA)学习(二十一)

对SVA(SystemVerilogt Assertion)有了更深刻的认识,对经典的AveMC形式验证工具进行了介绍

qq_46675545的博客 8470

设计模式-03_工厂模式

设计模式-03_工厂模式

m0_62036548的博客 827

保姆级教程:在Ubuntu 20.04上从源码编译Apollo自动驾驶平台(含GPU环境配置)

本文提供了一份详细的Ubuntu 20.04上从源码编译Apollo自动驾驶平台的保姆级教程,包括GPU环境配置、Docker部署和编译构建等关键步骤。通过实战经验和避坑指南,帮助开发者高效完成Apollo平台的编译和验证,适用于自动驾驶技术研究和应用开发。

weixin_30876945的博客 405

从ISCXTor2016到CICIDS2017:手把手教你下载和使用UNB的网络安全数据集

本文详细介绍了UNB大学发布的ISCXTor2016和CICIDS2017等网络安全数据集的下载与使用方法,特别适合加密流量识别和网络行为分析研究。文章提供了多种高效获取路径、文件结构解析及实战分析示例,帮助研究者快速上手这些真实场景捕获的精细标注数据集。

weixin_42524945的博客 630

设计模式03--工厂方法

目录 1.工厂方法 2.工厂方法的类图 1.工厂方法 工厂方法是对简单工厂的一个演进,最重要的是把一个类的实例化延迟到其子类,简单工厂是直接在工厂里实例化的。下面是一个简单工厂的类图: 简单工厂不属于23设计模式,更像是一种编码的风格.下面是工厂模式的通用类图: ...

最后的武艺集大成者 206

NX二次开发新建组件

NXOpen新建组件

qq_39541524的博客 329

设计模式03——工厂模式

//factory.cpp //工厂模式 #include <string> #include "gtest/gtest.h" class Operation { public: Operation() : x(0), y(0) {} virtual ~Operati...

aomenfan1838的博客 121

立体仓库WCS控制系统-AGV通信代码

string str = "任务下发,WCS->NT8000(q-Message),ikey:" + p.ikey.ToString() + "fromStation:" + p.fromStation.ToString() + "toStation:" + p.toStation.ToString();if (nt8000.Connect(_ServerAddr, _ServerPort)) QueueSpeech.AddQueue(string.Format("与NT8000重连成功"));

xdpcxq的专栏 2201

手把手教你学SINULINK-- --Linear Transformer 模块

模块是 Simulink 中用于模拟理想变压器行为的重要工具。通过本文的详细介绍,希望你能更好地理解和使用模块。

MHD0815的博客 2612

设计模式03_工厂

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

江州司马 1794

AI处理器组合

编号0-3的处理器处于同一个链路中,编号4-7的处理器处于另外一个链路中,不通链路中的处理器不能通信,如下图所示。- 如果申请处理器个数为1,则选择同一链路,剩余可用的处理器数量为1个的最佳,其次是剩余3个的为次佳,然后是剩余2个,最后是剩余4个。输出为组合列表,当array=[0, 1, 4, 5, 6, 7] ,num=1时,输出为[[0], [1]]- 如果申请处理器个数为2,则选择同一链路剩余可用的处理器数量2个的为最佳,其次是剩余4个,最后是剩余3个。任务申请1个处理器。

面试高手的博客 1万+

03-JAVA设计模式-工厂模式详解

工厂设计模式是一种创建型设计模式,它提供了一种封装对象创建过程的机制,将对象的创建与使用分离。这种设计模式允许我们在不修改客户端代码的情况下引入新的对象类型。在Java中,工厂设计模式主要有三种形式:简单工厂模式、工厂方法模式和抽象工厂模式。

丨Anna丨的博客 1322

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

03-设计模式——工厂模式

设计模式——工厂模式 模式定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类 Factory Method 使得一个类的实例化延迟到子类 应用场景 当你不知道该使用对象的确切类型的时候 当你希望为库或框架提供拓展内部组件的方法时 主要优点: 将具体产品和创建者解耦 符合单一职责原则 符合开闭原则 源码中的应用: // 静态工厂方法 NumberFormat ResourceBundle.getBundle() // 工厂方法 //流协议通用处理 java.net.URLStr

胖胖爱吃肉~的博客 369

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【设计模式03】抽象工厂模式

文章摘要: 本文介绍了抽象工厂模式在美团优选业务架构升级中的应用。面对多数据源管理(Mysql/MongoDB/Redis)带来的代码冗余和维护困难问题,作者通过抽象工厂模式实现了统一的数据源管理接口。文章解析了抽象工厂模式的核心思想(管理产品族)、类图结构、适用场景,并给出了两种实现方案:经典工厂类和基于注解的动态工厂。该模式有效解决了多数据源场景下的代码耦合问题,提升了系统的可扩展性和维护性。

专注后端技术架构,AI技术分享 1639

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【设计模式03】工厂模式

工厂模式属于创建型设计模式,顾名思义,用于创建对象的设计模式,可分为工厂方法和抽象工厂工厂方法:创建单一对象。扩展可以创建单例、原型抽象工厂:多个工厂方法创建多个对象。

weixin_44484668的博客 247

设计模式-03 设计模式-工厂模式factory-内部工厂

内部工厂模式是一种创建类对象的方式,其中工厂方法被封装在类内部,客户端只能通过类的公共接口来访问。内部工厂模式允许子类创建和管理自己的实例,而无需通过外部或父级工厂介入。这在需要有多个工厂来生成特定类型对象的不同变体或实现时很有用。如果符合这种场景,可以采用内部工厂设计模式。

jxusthusiwen的专栏 807

设计模式-03简单工厂模式

现实生活中,原始社会自给自足(没有工厂),农耕社会小作坊(简单工厂,民间酒坊),工业革命流水线(工厂方法,自产自销),现代产业链代工厂(抽象工厂,富士康)。我们的项目代码同样是由简到繁一步一步迭代而来的,但对于调用者来说,却越来越简单。在日常开发中,凡是需要生成复杂对象的地方,都可以尝试考虑使用工厂模式来代替。注意。...

数字人生 142

设计模式-03.抽象工厂模式

设计模式-03.抽象工厂模式

ctotalk 5765

【设计模式】03 简单工厂模式

定义 ​ 由一个工厂对象决定创建出哪一种产品类的实例 类型 创建型,但不属于 GOF23 种设计模式 使用场景 工厂类负责创建的对象比较少 客户端(应用层)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心 优点 只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节 缺点: 工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则 代码实例 ...

Yuu 180

代码实验03:设计模式-工厂模式

工厂模式简单来说就是提供一个创建对象的工厂,属于创建型模式,工厂模式又可以分为三种,分别是简单工厂模式(Simple Factory Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory)。

一只不懈努力的程序猿,通过代码实验洞悉技术的本质。 615

设计模式 03 · 工厂方法模式

本文探讨了工厂模式在解决对象创建问题中的应用与演进。文章从支付场景中的if-else代码痛点出发,阐述了简单工厂、工厂方法和抽象工厂三种模式的递进关系。 首先指出"new对象"也是一种耦合,简单工厂通过集中创建逻辑解决了这一问题,但仍违反开闭原则。工厂方法模式进一步改进,将产品创建权下放给子类工厂,每个具体工厂只负责创建一种产品,实现了新增支付渠道时无需修改现有代码。 文章通过支付案例展示了从简单工厂到工厂方法的演进过程,强调工厂模式的核心是将创建与使用分离,并分析了不同模式适用的场景。最后指出工厂方法通过

记录后端技术的深水区:MySQL、并发、JVM、分布式。原理为主,实战为辅,能少踩一个坑是一个。 546

03.设计模式之工厂模式

一、定义 任何可以产生对象的方法或类,都可以称之为工厂 单例也是一种工厂 为什么有了new之后,还需要有工厂? ①灵活控制生产过程 ②权限、修饰、日志… 二、讲述 Car类 public class Car { public void go(){ System.out.println("Car can go bibibibi..."); } } Plane类 public class Plane { public void go(){

棒棒的邦邦 154
上一篇: 设计模式-02单例模式
下一篇: 设计模式-04原型模式
胖柯G
博客等级 码龄10年 453粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值