JAVA设计模式(二)工厂模式与观察者模式

2023-11-12

工厂模式

  工厂模式顾名思义则是类似于一个工厂制造产品的模式。如富士康需要制造自己的产品,而同类产品有多种,如手机有各个品牌和型号一样。
  明白了工厂模式的含义,我们来想想这个模式具体是怎么回事。首先需要的是一个工厂于是就需要一个Factory类,再次就是需要一个抽象的产品类,如手机这个产品抽象类,该类提供了一些通用的生产手机的属性及方法,最后则是我们具体的手机产品。
下面就以富士康工厂生产小米,苹果,魅族为例。
首先定义好我们的抽象类Phone

public class abstract Phone {
    //产品的抽象方法,具体实现由各个产品去完成
    public abstract void productPhone();
}

接下来具体产品的定义

public class IPhone extends Phone {
     @Override
        public void productPhone() {
            System.out.println("Iphone开始生产");
        }

}
public class MiPhone extends Phone {
     @Override
        public void productPhone() {
            System.out.println("MiPhone开始生产");
        }

}
public class MeZPhone extends Phone {
     @Override
        public void productPhone() {
            System.out.println("MeZPhone开始生产");
        }

}

在确定了具体的产品后,需要一个工厂来生产他们。

public class FoxFactor {
    public static Phone createComputer(String type){
        Phone mPhone=null;
            switch (type) {
                case "apple":
                    mPhone=new IPhone();
                   break;
                case "mi":
                    mPhone=new MiPhone();
                    break;
                case "mez":
                    mPhone=new MeZPhone();
                    break;

            }
            return mPhone;
    }
}

下面需要生产哪一种手机只需要调用工厂的方法 即可,如果升级生产流程更改只需要修改对应手机类进行了。
下面是调用方法:

public class CreatPhone {
    public static void main(String[]args){
        FoxFactor.createComputer("mi").start();
    }
}

观察者模式

  观察者模式:属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
一般来说定义总是很抽象的,我们举个具体的例子来说明。比如去吃烤肉,几个小伙伴都围着炉子等肉熟,肉熟了后就是肉状态的变化,并且通知给想吃的小伙伴,这样小伙伴们就可以快乐的吃肉了。
  为了实现这种模型,我们先来梳理下思路。首先是观察者,就是想吃肉的小伙伴们。其次就是被烤的肉了,就是被观察者。这两者之间为了较好的解耦可以通过接口来进行通信。因此就有了观察者接口和被观察者接口。
先来看看被观察者。

public interface ISubjectBBQ {

    //被观察者可以添加、删除、通知观察者
    public void addObserver(PartnerOberver partnerOberver);
    public void deletOberver(PartnerOberver partnerOberver);
    public void notifyProcess(String process);
}

实现了接口的被观察者类。

public class SubjectBBQ implements ISubjectBBQ{

    private ArrayList<PartnerOberver> mPartnerObervers = null;

    public  SubjectBBQ() {
        // TODO Auto-generated constructor stub
        mPartnerObervers = new ArrayList<PartnerOberver>();
    }
    @Override
    public void addObserver(PartnerOberver partnerOberver) {
        // TODO Auto-generated method stub
        mPartnerObervers.add(partnerOberver);
    }

    @Override
    public void deletOberver(PartnerOberver partnerOberver) {
        // TODO Auto-generated method stub
        mPartnerObervers.remove(partnerOberver);
    }

    @Override
    public void notifyProcess(String processmsg) {
        //当被观察者状态发生变化的时候就通知到观察者
        // TODO Auto-generated method stub
        for(PartnerOberver partnerOberver : mPartnerObervers) {
            partnerOberver.updata(processmsg);
        }
    }

}

下面是观察者相关代码

public interface IPartnerObserver {
//观察者的方法,用于更新
    public void updata(String processmsg);
}
public class PartnerOberver implements IPartnerObserver{
    private String name;
    private String favorite;

    public PartnerOberver(String name,String favorite) {
        // TODO Auto-generated constructor stub
        this.name = name;
        this.favorite = favorite;
    }
    //根据烤肉进度来决定是否开始吃
    @Override
    public void updata(String processmsg) {
        // TODO Auto-generated method stub
        if(processmsg.equals(favorite)) {
            System.out.println(name+" "+favorite+"开吃了");
        }
    }
}

下面是如何使用

public class MyClient {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SubjectBBQ mSubjectBBQ = new SubjectBBQ();

        PartnerOberver partnerA = new PartnerOberver("小A", "七分熟");
        PartnerOberver partnerB = new PartnerOberver("小B", "八分熟");
        PartnerOberver partnerC = new PartnerOberver("小C", "十分熟");
        // 为被观察者(烤肉)注册观察者
        mSubjectBBQ.addObserver(partnerA);
        mSubjectBBQ.addObserver(partnerB);
        mSubjectBBQ.addObserver(partnerC);

        //烤肉状态变化
        mSubjectBBQ.notifyProcess("七分熟");
        mSubjectBBQ.notifyProcess("八分熟");
        mSubjectBBQ.notifyProcess("十分熟");
        System.out.println("11");
    }

}

小A 七分熟开吃了
小B 八分熟开吃了
小C 十分熟开吃了
观察者模式在Android中有着较多的应用,如在一个adapter钟,数据更新时,notifyDataSetChanged()也是通过观察者模式完成的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA设计模式(二)工厂模式与观察者模式 的相关文章

  • 创建型模式 - 单例模式

    核心 严谨起见 私有构造必须要加 避免外部创建新的实例 特性 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一实例 常用的几种单例模式写法 懒汉方式 双重锁方式 静态类方式 每种方式对应的特性 方式
  • Gof23设计模式之简单工厂/静态工厂模式

    在java中 万物皆对象 这些对象都需要创建 如果创建的时候直接new该对象 就会对该对象耦合严重 假如我们要更换对象 所有new对象的地方都需要修改一遍 这显然违背了软件设计的开闭原则 如果我们使用工厂来生产对象 我们就只和工厂打交道就可
  • Head First Design Mode(12)-状态模式

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 状态模式 状态模式和策略模式是 双胞胎 在出生时才分开 策略模式是围绕可以互换的算法来创建成功业务的 状态模式则是通过改变对象内部的状态来帮助对象控制自己的行为 状态
  • 开放-封闭原则

    一 定义 开放 封闭原则 是说软件实体 类 模块 函数等等 应该是可扩展的 但是不可修改 ASD 这个原则其实是有两个特征 一个是说 对于扩展是开放的 Open for extension 对于更改是封闭的 Closed for modif
  • 观察者模式(推模型+拉模型)

    观察者模式 Observer Pattern 当一个对象被修改时 会自动通知它的依赖对象 现在我们是新闻社 要向所有新闻订阅者推送新闻 那么该如何实现呢 经过思考我们不难发现一家新闻社一般对应的是多个新闻订阅者 那么我们先从新闻社开始入手
  • 设计模式深入浅出--21.命令模式简单实例及其在JDK中的应用

    命令模式 定义 将 请求 封装成对象 以便使用不同的请求 命令模式解决了应用程序中对象的职责以及它们之间的通信方式 类型 行为型 适用场景 请求调用者和请求接收者需要解耦 使得调用者和接收者不直接交互 需要抽象出等待执行的行为 优点 降低解
  • java设计模式——策略模式(Strategy Pattern)

    概述 在策略模式中 我们可以定义一些独立的类来封装不同的算法 每一个类封装一种具体的算法 在这里 每一个封装算法的类我们都可以称之为一种策略 Strategy 为了保证这些策略在使用时具有一致性 一般会提供一个抽象的策略类来做规则的定义 而
  • java设计模式——工厂方法模式(Factory Method Pattern)

    简单工厂模式虽然简单 但也受到很大限制 扩展性太差 当系统中需要引入新产品时 由于静态工厂方法通过所传入参数的不同来创建不同的产品 这必定要修改工厂类的源代码 将违背 开闭原则 如何实现增加新产品而不影响已有代码 工厂方法模式应运而生 本文
  • Java设计模式-迪米特法则

    迪米特法则 Low Of Demeter 定义 一个对象应该对其他对象保持最少的了解 问题由来 类与类之间的关系越密切 耦合度越大 当一个类发生改变时 对另一个类的影响也越大 解决方案 尽量降低类与类之间的耦合 自从我们接触编程开始 就知道
  • 细说设计模式七大原则(6):开闭原则

    2 8 1 基本介绍 英文名 Open Closed Principle OCP 定义 一个软件实体如类 模块和函数应该对扩展开放 对修改关闭 开闭原则是编程中最基础 最重要的设计原则 一个软件实体如类 模块和函数应该对扩展开放 对提供方
  • Gof23设计模式之原型模式

    1 概述 用一个已经创建的实例作为原型 通过复制该原型对象来创建一个和原型对象相同的新对象 2 结构 原型模式包含一下角色 抽象原型类 规定了具体原型对象必须实现的clone 方法 具体原型类 实现了抽象圆形类的clone 方法 它是可被复
  • 软件设计模式----访问者模式

    访问者模式 模式动机 对于系统中的某些对象 它们存储在同一个集合中 且具有不同的类型 而且对于该集合中的对象 可以接受一类称为访问者的对象来访问 而且不同的访问者其访问方式有所不同 访问者模式为解决这类问题而诞生 在实际使用时 对同一集合对
  • Gof23设计模式之模板方法模式

    1 定义 定义一个操作中的算法骨架 而将算法的一些步骤延迟到子类中 使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤 2 结构 模板方法 Template Method 模式包含以下主要角色 抽象类 Abstract Clas
  • Head First Design Mode(5)-工厂模式

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 工厂模式 烘烤OO的精华 烘烤某些松耦合的OO设计 除了使用new操作符之外 还有更多制造对象的方法 本章我们将了解到实例化的这个活动不应该总是公开的进行 认识到初始
  • JAVA设计模式(二)工厂模式与观察者模式

    工厂模式 工厂模式顾名思义则是类似于一个工厂制造产品的模式 如富士康需要制造自己的产品 而同类产品有多种 如手机有各个品牌和型号一样 明白了工厂模式的含义 我们来想想这个模式具体是怎么回事 首先需要的是一个工厂于是就需要一个Factory类
  • Java设计模式(25):责任链模式(职责链模式)

    25 责任链模式 25 1 问题引入 采购需求 采购员需要采购一批教学器材 对器材采购金额有分级审批权限 如果金额小于等于3000元 由教学主任审批 0 lt x lt 3000 如果金额小于等于10000元 由院长审批 3000 lt x
  • 【JAVA设计模式】之桥接模式(BridgePattern)

    桥接模式的作用是将两样东西连接起来 比如桥梁把河的两岸连接起来 桥接模式把 类的功能层次结构 和 类的实现层次结构 连接起来 类的层次结构 类的功能层次 父类通过定义抽象方法来定义接口API 类的实现层次 子类通过实现具体方法来实现接口AP
  • java设计模式——简单工厂模式(Simple Factory Pattern)

    定义 简单工厂模式 Simple Factory Pattern 又称为静态工厂方法 Static Factory Method 模式 它属于类创建型模式 在简单工 厂模 式中 可以根据参数的不同返回不同类的实例 结构 Factory 工厂
  • java设计模式——抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式产生的动机 为了更清晰地理解工厂方法模式 需要先引入两个概念 产品等级结构 产品等级结构即产品的继承结构 如一个抽象类是电视机 其子类有海尔电视机 海信电视机 TCL电视机 则抽象电视机与具体品牌的电视机之间构成了一个产品等级结
  • Java设计模式-单例模式

    单例模式 在有些系统中 为了节省内存资源 保证数据内容的一致性 对某些类要求只能创建一个实例 这就是所谓的单例模式 单例模式的定义与特点 单例 Singleton 模式的定义 指一个类只有一个实例 且该类能自行创建这个实例的一种模式 例如

随机推荐

  • 利用强化学习进行股票操作实战(四)

    本次实战代码仍是在之前基础上进行了一些修改 之前只在一支股票上进行训练 这次我将模型放在多支股票上训练 并在多支股票上进行了测试 对于多支股票的训练策略 没有参考过别人的训练方案 做这个的比较少 我按自己的理解去训练 每一轮训练 都将每支股
  • 芯片面积估计方法

    一 概念 芯片面积的主要涵盖部分分为三部分 IO 芯片的信号及电源pad等 Standard cell 实现芯片的功能逻辑 Macro block 第三方IP PLL DAC POR Memory etc 芯片面积估计就是通过目标工艺的库信
  • Python:使用 print 打印“Hello World!”以及其它字符内容

    哈喽 大家好 我是wangzirui32 这是我的第一篇博文 发现内容有误还请多多提出 谢谢 今天 我们将使用Python的print 来帮助我们让程序输出指定内容 如果你的Python版本是3 x print 将作为一个Python内置函
  • 第五周总结&实验报告三

    实验三 String类的应用 实验目的 掌握类String类的使用 学会使用JDK帮助文档 实验内容 1 已知字符串 this is a test of java 按要求执行以下操作 要求源代码 结果截图 1 统计该字符串中字母s出现的次数
  • 全国计算机等级考试题库二级C操作题100套(第79套)

    第79套 给定程序中 函数fun的功能是 求ss所指字符串数组中长度最短的字符串所在的行下标 作为函数值返回 并把其串长放在形参n所指变量中 ss所指字符串数组中共有M个字符串 且串长
  • js 查找字符串中指定字符 模糊查询 不区分大小写

    js 查找特定字符 模糊查询 不区分大小写 var str hello world hello coder 查找 HELLO 是否存在 找不到返回null var reg new RegExp HELLO i var isHas str m
  • Opencv-C++笔记 (12) : opencv-仿射变化

    文章目录 一 概述 二 GetRotationMatrix2D 三 warpAffine 一 概述 介绍完图像的缩放和翻转后 接下来将要介绍图像的旋转 但是在OpenCV 4中并没有专门用于图像旋转的函数 而是通过图像的仿射变换实现图像的旋
  • Python笔记:在Pandas中处理NaN值

    关于NaN值 在能够使用大型数据集训练学习算法之前 我们通常需要先清理数据 也就是说 我们需要通过某个方法检测并更正数据中的错误 任何给定数据集可能会出现各种糟糕的数据 例如离群值或不正确的值 但是我们几乎始终会遇到的糟糕数据类型是缺少值
  • vue element plus对话框第二次点击时 选择器不显示

    第一次点击时下拉框出现正常 关闭窗口后再次进入 选择器的下拉框不会出现 可给选择器设置属性 teleported false
  • AutoHotkey中的变量名 全局与局部冲突问题 - double-ref 双重引用

    文章目录 test 测试脚本 AutoHotkey中 全局变量与局部变量的作用域要缕清 已知一个 变量名foo 被一个全局变量 和 一个函数中的局部变量 使用 在该函数中 foo默认是局部变量 直接使用foo 其内容为空 双重解引用的变量
  • C++语言导学 第三章 模块化 - 3.4 名字空间

    C 语言导学 第三章 模块化 3 4 名字空间 3 4 名字空间 3 4 名字空间 除了函数 类和枚举之外 C 还提供了一种称为名字空间 namespace 的机制 用来表达某些声明属于一个整体以及它们的名字不会与其他名字冲突 例如 我希望
  • nodejs开启局域网广播获取ip通信

    bonjour 纯JavaScript中的Bonjour Zeroconf协议实现 使用多播DNS在本地网络上发布服务或发现现有服务 安装 npm install bonjour 使用方法 局域网A主机 import bonjour fro
  • _cdecl、_stdcall和_fastcall的区别

    概述 在windows开发环境中有三种觉的调用协议 分别为 cdecl C调用 stdcall 标准调用 fastcall 快速调用 三种调用方式有参数传递和栈帧恢复的方式有所不同 本文在结合汇编代码简要说明一下有三种调用方式的区别 环境
  • 解决警告——warning C4018: “<”: 有符号/无符号不匹配

    今天遇到这个问题 虽然不影响程序运行 但作为完美主义者 有警告总感觉不舒服 所以就查了一下解决方法 出错代码 for int j 0 j
  • centos下mysql 看不到mysql数据库(密码无法更改)

    1 这可能是因为mysql数据库的user表里 存在用户名为空的账户即匿名账户 导致登录的时候是虽然用的是root 但实际是匿名登录的 2 解决方案 2 1 关闭mysql service mysqld stop 2 2 屏蔽权限 mysq
  • verilog中给变量指定的位赋值

    reg 15 0 Data reg 3 0 i reg 1 0 data r begin Data i i 1 lt data r end 此类赋值是错误的 我自己修改了语句 如下 begin Data i lt data r 1 Data
  • ELK 日志分析搭建

    目录 一 ELK概述 1 1 概述 1 1 1 Elasticsearch概述 1 1 2 Logstash概述 1 1 3 kibana概述 1 2 ELK解决处理的事务 1 3 ELK优点 二 ELK 搭建操作 2 1 实验配置环境 2
  • Android Studio 打正式包

    第一步 第二步 第三步 第四步 第五步
  • v3

    hfd gd size 127152 size data 785449D1D343094895706D2DB2745030C466BEDCB9A26FC112F8C23E67BAF657 A5E4B40F93ADFDEBECBC0BB83F
  • JAVA设计模式(二)工厂模式与观察者模式

    工厂模式 工厂模式顾名思义则是类似于一个工厂制造产品的模式 如富士康需要制造自己的产品 而同类产品有多种 如手机有各个品牌和型号一样 明白了工厂模式的含义 我们来想想这个模式具体是怎么回事 首先需要的是一个工厂于是就需要一个Factory类