设计模式之工厂方法模式精讲

news2024/11/23 4:49:19

工厂方法模式又叫虚拟构造函数(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建性工作推迟到子类中。

工厂模式可以分为简单工厂、工厂方法和抽象工厂模式。

  1. 简单工厂模式:需要注意的是,简单工厂并不包含在《GoF》一书中定义的23种设计模式,因为它过于简单,更像是一种编程习惯,并且它违反了开闭原则,增加工厂需要修改类的实现。
  2. 工厂方法模式:是简单工厂模式的进一步抽象和推广,将具体创建工作交给子类去做,避免违反开闭原则。
  3. 抽象工厂模式:如果说工厂方法模式针对的是一个产品等级结构,那么抽象工厂模式面对的就是多个产品等级结构。
    由于简单工厂模式严格来说并不算是一种设计模式,就不再画UML图了,大家通过一个例子感受一下它的用法:
public interface Shape {
    void draw();
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("draw a circle");
    }
}

public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("draw a square");
    }
}

public class SimpleFactory {
    public static Shape createShape(String shapeType) {
        if (shapeType == null) {
            throw new IllegalArgumentException("Shape type cannot be null.");
        }
        switch (shapeType.toLowerCase()) {
            case "circle":
                return new Circle();
            case "square":
                return new Square();
            default:
                throw new IllegalArgumentException("Unsupported shape type: " + shapeType);
        }
    }
}

public class Demo {
    public static void main(String[] args) {
        Shape circle = SimpleFactory.createShape("circle");
        circle.draw();
        Shape square = SimpleFactory.createShape("square");
        square.draw();
        Shape triangle = SimpleFactory.createShape("triangle");
        triangle.draw();
    }
}

工厂方法模式的UML图如下:

在这里插入图片描述

下面还是以一个例子来说明工厂方法模式的用法。假设有一个果农接口,相当于图中的Creator,有一个葡萄果农和一个苹果农分别实现果农接口,这两个类相当于ConcreteCreator类。然后有一个水果接口 ,相当于Product接口,一个苹果类和一个葡萄类分别实现水果接口。这时候注意体会工厂方法模式和简单工厂模式的区别,工厂方法模式把创建对象的工作分别放到葡萄果农和苹果农的类中去实现,也就是在具体类中实现。

public interface GuoNong {
    Fruit createFruit();
}

public class GrapeNong implements GuoNong {
    @Override
    public Fruit createFruit() {
        return new Grape();
    }
}

public class AppleNong implements GuoNong {
    @Override
    public Fruit createFruit() {
        return new Apple();
    }
}

public interface Fruit {
    void plant();
    void grow();
    void harvest();
}

public class Grape implements Fruit {
    @Override
    public void plant() {
        System.out.println("种葡萄");
    }
    @Override
    public void grow() {
        System.out.println("葡萄生长");
    }
    @Override
    public void harvest() {
        System.out.println("收葡萄");
    }
}

public class Apple implements Fruit{
    @Override
    public void plant() {
        System.out.println("种苹果");
    }
    @Override
    public void grow() {
        System.out.println("苹果生长");
    }
    @Override
    public void harvest() {
        System.out.println("收苹果");
    }
}

public class Demo {
    public static void main(String[] args) {
        GrapeNong grapeNong = new GrapeNong();
        Fruit grape = grapeNong.createFruit();
        grape.plant();
        grape.grow();
        grape.harvest();
        System.out.println("**************分割线**********************");
        AppleNong appleNong = new AppleNong();
        Fruit apple = appleNong.createFruit();
        apple.plant();
        apple.grow();
        apple.harvest();
    }
}

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

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

相关文章

【哈希专题】【蓝桥杯备考训练】:星空之夜、模拟散列表、字符串哈希、四平方和、扫雷【已更新完成】

目录 1、星空之夜(usaco training 5.1) 2、模拟散列表(模板) 3、字符串哈希(模板) 4、四平方和(第七届蓝桥杯省赛C A组/B组 & JAVA B组/C组) 5、扫雷(Google Ki…

【学习】软件测试行业未来的发展趋势预测

近年来,随着中国数字经济的蓬勃发展,软件测试行业也迎来了新的春天。从早期的手工测试到自动化测试,再到持续集成和持续交付,中国的软件测试行业经历了快速的发展和变革。各行各业均对软件测试提出了更高的要求,尤其在…

基于java+springboot+vue实现的大学生二手物品交易商城(文末源码+Lw+ppt)23-329

摘 要 二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针对这…

暴雨讲堂:AI时代第五代英特尔CPU能做什么?

如果把科技圈比作娱乐圈,那么这两年的顶流一定是AI。2023年,世人见证了ChatGPT在全球范围内的大火,以生成式AI为代表的新一轮人工智能应用问世,改变了人工智能(AI)技术与应用的发展轨迹,并开始在…

展馆人数统计显示屏的功能分析

展馆人数统计显示屏是展览馆、博物馆、商场等公共场所常见的一种设备,它能够实时显示当前场馆内的人数信息,为管理者和游客提供重要参考。展馆人数统计显示屏的功能分析是对这一设备的作用、特点和优势进行深入剖析,有助于更好地了解其在实际…

音视频处理 - 音频概念详解,码率,采样率,位深度,声道,编码

1. 音频采样 与视频不同,音频的最小单位不是一帧,而是一个采样。 采样是当前一刻声音的声音样本,样本需要经过数字转换才能存储为样本数据。 真实声音是连续的,但是在计算机中,声音是离散且均匀的声音样本。 2. 位深…

【倪琴仲尼式-雷伴】全新倪诗韵精品杉木古琴

试音中的用弦:梦音,视频录音无任何处理,所见即所得。 现琴比照片更好看。倪琴吊牌、琴额后面的编码和倪琴官网上的序列号是一一对应的,可查。 雷伴,“伴”字取意陪伴、相伴、依随。栗壳色,纯鹿角霜生漆工艺…

反射率光纤光谱仪检测汽车后视镜反射率

反射率光纤光谱仪是一种用于测量材料表面反射率的精密仪器,它通过光纤传输光信号,并利用光谱仪进行分析,以确定材料的光学特性。反射率光纤光谱仪的工作原理基于相对反射率的计算,它涉及到光源、光纤、光谱仪等关键组件。 后视镜能…

使用ES5进行win10系统封装

一、概述 为什么那时候会折腾这个呢,因为我平时用的一般是PE或者直接刻录安装系统,但是这样类似于每次安装完系统后都需要进行一些优化设置,比如电源选项、资源管理器设置、办公软件安装等等,我也听说过ghost但是没有实际用过不过…

Apache Hive的部署与体验

一、Apache Hive概述 什么是分布式SQL计算? 以分布式的形式,执行SQL语句,进行数据统计分析。Apache Hive是做什么的? 很简单,将SQL语句翻译成MapReduce程序,从而提供用户分布式SQL计算的能力。传统MapRed…

[2023] 14届

1.日期统计 题意 1.日期统计 - 蓝桥云课 (lanqiao.cn) 思路 用dfs扫 对每一个位进行限制 花了一个小时 注意把答案枚举出来 对应一下看到底对不对 code #include<iostream> #include<cstdio> #include<stack> #include<vector> #include<al…

一文看懂算法交易(二)

国内T0算法哪家强&#xff1f;算法交易费用是多少&#xff1f;算法交易哪些平台好&#xff1f; 我们接上文今天给大家继续分享&#xff0c;我们昨天大致了解了什么是算法交易&#xff0c;国内的算法总线大概有些啥&#xff0c;算法交易的类型。那么我们今天再普及下&#xff0c…

neo4j使用详解(三、cypher插入语法——最全参考)

1.插入语法 create, merge, set, delete, remove, create unique, load csv(import) 除插入语法外另外的语法详情请博主其他文章&#xff1a; 查询语法 其他语法 1.1.create语法 创建单个节点: create(n) # (ID:n) 创建带标签的节点: create (n:Person) # (ID:n, label:Perso…

Tableau项目实战-网站流量统计分析

数据介绍 网站流量分析.xlsx 1、页面指标分析 页面指标主要有网站流量指标、用户行为指标、用户浏览网站的方式等。 页面访问次数 访客完整打开网站页面进行访问的次数,访问次数是网站访问速度的衡量标准。 平均停留的时间 平均访问时长是用户访问网站的平均停留时间。 …

力扣HOT100 - 42. 接雨水

解题思路&#xff1a; 动态规划 感觉不是很好想 class Solution {public int trap(int[] height) {int n height.length;if (n 0) return 0;int[] leftMax new int[n];leftMax[0] height[0];for (int i 1; i < n; i) {leftMax[i] Math.max(leftMax[i - 1], height[i…

基于Springboot Vue医院管理系统+数据库脚本+文档(万字)

项目效果视频: 基于Springboot Vue医院管理系统 一、 项目介绍 角色&#xff1a;管理员、患者、医生 基于springboot vue实现的医院管理系统&#xff0c;有管理员、医生和患者三种角色。系统拥有丰富的功能&#xff0c;能够满足各类用户的需求&#xff0c;系统提供了登录和注册…

javaWeb学生宿舍管理系统

一、摘要 本博客介绍了如何使用Spring Boot和MySQL构建一个功能完善的JavaWeb学生宿舍管理系统。该系统分为三个角色&#xff1a;管理员、宿管和学生。管理员拥有对整个系统的全面管理权限&#xff0c;包括学生管理、宿舍管理、入住管理和管理员管理&#xff1b;宿管负责宿舍的…

线上linux服务器升级nginx

一个nginx版本空包 一个pcre文件 一个zlib文件 ./configure配置文件 make编译 make install复制所有文件到nginx 如果nginx -v无版本号 检查环境变量cat /etc/profile 编辑 环境变量vi /etc/profile 按i进入编辑模式 按esc进入查看模式 因为path中并未使用%JAVA_HOME%字样…

QMT量化交易上手

文章目录 QMT介绍基本使用代码初始化股票和行情交易量化策略示例相关链接QMT介绍 QMT是迅投公司出品量化交易客户端软件,目前只能运行在windows机器上,分为QMT 和 miniQMT两种模式,后者可以采用python API做程序化交易,极大方便了广大散户。这点上比同花顺/通信达好很多。…

在 IntelliJ IDEA 中使用 Terminal 执行 git log 命令后的退出方法

前言 IntelliJ IDEA 是一款广受欢迎的集成开发环境&#xff0c;它内置了强大的终端工具&#xff0c;使得开发者无需离开IDE就能便捷地执行各种命令行操作&#xff0c;包括使用 Git 进行版本控制。在 IDEA 的 Terminal 中执行 git log 命令时&#xff0c;由于该命令会显示项目的…