创建型模式之工厂模式


本质: 实例化对象不直接使用new,而是用工厂代替

工厂模式分为:

  • 简单工厂模式:用来生产同一等级结构中的任意产品(增加新产品需要修改已有代码)
  • 工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
  • 抽象工厂模式:围绕一个超级工厂创建其他工厂,超级工厂可看做工厂的工厂。

简单工厂模式

为了生成所需的具体产品,工厂类提供方法,根据传入的参数决定具体实例化哪个产品类。

//产品接口:车
public interface Car {
    public void run();
}

//具体产品1:比亚迪
public class BYD implements Car{
    @Override
    public void run() {
        System.out.println("比亚迪");
    }
}
//具体产品2:特斯拉
public class TSL implements Car{
    @Override
    public void run() {
        System.out.println("特斯拉");
    }
}

//车工厂
public class CarFactory {
    public static Car getCar(String carType){
        Car car = null;
        if(carType.equals("BYD")){
            car = new BYD();
        }else if(carType.equals("TSL")){
            car = new TSL();
        }
        return car;
    }
}

//测试类
public class Consumer {
    public static void main(String[] args) {
        Car byd = new CarFactory().getCar("BYD");
        Car tsl = new CarFactory().getCar("TSL");
        byd.run();
        tsl.run();
    }
}


工厂方法模式

定义一个用于创建对象的接口,让子类决定去实例化哪个类,使得类的实例化延迟到子类。
示例:

//产品:车
public interface Car {
    public void run();
}
//具体产品1:比亚迪
public class BYD implements Car{
    @Override
    public void run() {
        System.out.println("比亚迪");
    }
}
//具体产品2:特斯拉
public class TSL implements Car {
    @Override
    public void run() {
        System.out.println("特斯拉");
    }
}
//车工厂
public interface CarFactory {
public Car getCar();
}

//具体产品对应的工厂1:比亚迪工厂
public class BYDFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new BYD();
    }
}

//具体产品对应的工厂2:特斯拉工厂
public class TSLFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new TSL();
    }
}

//测试类
public class Consumer {
    public static void main(String[] args) {
        BYDFactory bydFactory = new BYDFactory();
        TSLFactory tslFactory = new TSLFactory();
        bydFactory.getCar().run();
        tslFactory.getCar().run();
    }
}

抽象工厂模式

public interface PhoneProduct {
    public void call();
    public void sendSMS();
    public void takePhoto();
}

public interface RouteProduct {
    public void start();
    public void shutDown();
    public void openWifi();
    public void setting();

}
public class HuaweiPhone implements PhoneProduct{
    @Override
    public void call() {
        System.out.println("华为手机打电话");
    }
    @Override
    public void sendSMS() {
        System.out.println("华为手机发短信");
    }
    @Override
    public void takePhoto() {
        System.out.println("华为手机拍照");
    }
}

public class XiaomiPhone implements PhoneProduct{
    @Override
    public void call() {
        System.out.println("小米手机打电话");
    }

    @Override
    public void sendSMS() {
        System.out.println("小米手机发短信");
    }
    @Override
    public void takePhoto() {
    System.out.println("小米手机拍照");
    }
}

public class HuaweiRoute implements RouteProduct{
    @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 XiaomiRoute implements RouteProduct {
    @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 interface ProductFactory {
   PhoneProduct phoneProduct();
   RouteProduct routeProduct();
}

public class HuaweiFactory implements ProductFactory{
    @Override
    public PhoneProduct phoneProduct() {
        return new HuaweiPhone();
    }
    @Override
    public RouteProduct routeProduct() {
       return new HuaweiRoute();
    }
}
public class XiaomiFactory implements ProductFactory{
    @Override
    public PhoneProduct phoneProduct() {
        return new XiaomiPhone();
    }
    @Override
    public RouteProduct routeProduct() {
      return new XiaomiRoute();
    }
}

//测试类
public class Consumer {
    public static void main(String[] args) {
        System.out.println("====小米系列产品====");
        XiaomiFactory xiaomiFactory = new XiaomiFactory();
        PhoneProduct xiaomiPhone = xiaomiFactory.phoneProduct();
        RouteProduct xiaomiRoute = xiaomiFactory.routeProduct();
        xiaomiPhone.call();
        xiaomiRoute.setting();

        System.out.println("====华为系列产品====");
        HuaweiFactory huaweiFactory = new HuaweiFactory();
        PhoneProduct huaweiPhone = huaweiFactory.phoneProduct();
        RouteProduct huaweiRoute = huaweiFactory.routeProduct();
        huaweiPhone.call();
        huaweiRoute.setting();

    }
}

参考:
《实用软件设计模式教程》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Learning Semantic-Aware Knowledge Guidance forLow-Light Image Enhancement

微光图像增强(LLIE)研究如何提高照明并生成正常光图像。现有的大多数方法都是通过全局和统一的方式来改善低光图像,而不考虑不同区域的语义信息。如果没有语义先验,网络可能很容易偏离区域的原始颜色。为了解决这个问题&#xff0…

[原创][R语言]股票分析实战[2]:周级别涨幅趋势的相关性

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

linux 应用开发笔记---【信号:基础】

1.基本概念 信号是发生事件时对进程的通知机制,也可以称为软件中断 信号的目的是用来通信的 1.硬件发生异常,将错误信息通知给内核,然后内核将相关的信号给相关的进程 2.在终端输入特殊字符产生特殊信号 3.进程调用kill()将任意信号发送…

springboot使用EasyExcel导出数据

springboot使用EasyExcel导出数据 简介:本文主要描述使用EasyExcel导出数据的简单流程,事实上企业需求一般都比较简单,就是表单数据输出到Excel即可,如果数据量大的话,为了避免占用内存过高或者OOM,使用多…

DeciLM-7B:突破极限,高效率、高精准度的70亿参数AI模型

引言 在人工智能领域,语言模型的发展速度令人瞩目。Deci团队最近推出了一款具有革命性意义的语言模型——DeciLM-7B。这款模型在速度和精确度上都实现了显著的突破,以其70亿参数的规模,在语言模型的竞争中脱颖而出。 Huggingface模型下载&am…

Oracle EBS PAC“定期成本分配处理程序”报错:30004不存在为成本类型、成本组和法人主体定义的帐户

Oracle EBS版本: RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: 中文环境: 30004不存在为成本类型、成本组和法人主体定义的帐户。 CSTPALPC.dyn_proc_call : Error Calling Package 30004不存在为成本类型、成本组和法人主…

牛客网 DP34 【模板】前缀和(优质解法)

代码: import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { // 注…

【数据分享】2019-2023年我国区县逐年二手房房价数据(Excel/Shp格式)

房价是一个区域发展程度的重要体现,一个区域的房价越高通常代表这个区域越发达,对于人口的吸引力越大!因此,房价数据是我们在各项城市研究中都非常常用的数据!之前我们分享了2019—2023年我国区县逐月的二手房房价数据…

【OpenGL/WebGL】Shader中如何获取摄像机视口的宽高

一、需求背景 在有些需求中,物体的大小是随着摄像机的视口的大小而变化的。如下图中,蓝色小方块,随着不断放大,其大小有个最大值,并不会无限放大。 这种实现的原理是在Shader中,不断根据摄像机近平面尺寸大…

实验记录:深度学习模型收敛速度慢有哪些原因

深度学习模型收敛速度慢有哪些原因? 学习率设置不当: 学习率是算法中一个重要的超参数,它控制模型参数在每次迭代中的更新幅度。如果学习率过大,可能会导致模型在训练过程中的振荡,进而影响到收敛速度;如果…

leetcode刷题日志-383赎金信

思路:分别用两个map记录ransomNote和magazine中的字符以及出现的次数。最后遍历记录ransomNote的map,如果ransomNote的map中出现的magazine的map中没有出现或者出现的次数小于ransomNote的map则返回false,否则返回true; class So…

ffmpeg6.0-ffplay.c源码分析(三)之read_thread和stream_component_open函数详细分析

文章目录 第一部分:for (;;) {}之前stream_component_open函数解析第二部分:for (;;) {}之内第三部分:for (;;) {}之后关注公众号看全文: 看名字就可以知道这是读数据的线程。在前面的文章中是不是一直没看到avformat_open_input、av_read_frame之类的函数,没错都在这个…

Element 介绍

Element 介绍 Vue 快速入门 Vue 常见组件 表格 分页组件 其他自己去看吧 链接: 其他组件

数据结构之<图>的介绍

图(Graph)的概念: 在数据结构中,图是由节点(顶点)和边组成的非线性数据结构。图用于表示不同对象之间的关系,其中节点表示对象,边表示对象之间的连接或关系。 1.图的基本组成元素&a…

小项目:迷宫二

目录 引言一、题目描述二、解题思路三、代码实现四、测试 引言 这个迷宫项目是今天参加学校的一个比赛出的题目,从早上九点基本搞到了四五点才完成,其实写出来发现基本思路其实挺简单的,就是想不好想,真的要各种的尝试&#xff0…

设计模式(2)--对象创建(5)--单件

1. 意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 2. 一种角色 单件(Singleton) 3. 优点 3.1 对唯一实例的受控访问 3.2 缩小名空间(对全局变量的改进) 3.3 允许对操作和表示精化(可以有子类) 3.4 允许可变数目的实例 3.5 比类操作更灵活 4. 缺点…

ReenterLock重入锁

synchronized就是一种最简单的控制方法,它决定了一个线程释放可以访问临界区资源。 同时,Object.wait()方法和Object.notify()方法起到了线程等待和通知的作用。 ReenterLock重入锁可以完全替代关键字Synchoronized.重入锁是Synchoronized、Object.wait(…

reactive数据不响应

我们知道,reactive函数用于创建对象等复杂数据的响应式代理对象,当该对象的属性发生变化时,会自动触发视图更新。 但在Vue 3中,当我们使用reactive创建的对象或数组进行赋值时,尽管能够完成正常的赋值操作&#xff0c…

RK3568平台(网络篇)添加网络交换芯片RTL8306M

一.硬件原理图 分析: 该交换芯片支持I2C、SPI、mdio通信,但是看ast1520的uboot代码采用的是mdio去通信phy芯片的,所以暂时也先采用mdio的方式,需要配置相应的引脚才可以配置成mdio通信模式,具体的配置硬件工程师解决。…

HarmonyOS开发实战:如何实现一个运动排名榜页面

HarmonyOS开发实战:如何实现一个运动排名榜页面 代码仓库: 运动排名榜页面 项目介绍 本项目使用声明式语法和组件化基础知识,搭建一个可刷新的排行榜页面。在排行榜页面中,使用循环渲染控制语法来实现列表数据渲染,…