常用的设计模式详解。

news/2024/11/30 10:28:12/

目录

工厂模式(创建型)

适配器模式(行为模式)

观察者模式(行为模式)

单例模式


工厂模式(创建型)

1、简单工厂模式:

        又称静态工厂方法,根据参数的不同返回不同类的实例。简单工厂模式就是专门定义一个类来负责创建其他类的实例。比如说Java中工具类DateFormat,根据传入参数的不同,可以返回不同时间格式的类

2、工厂模式(接口)

        简单工厂模式的那个工厂是需要知道所有类的实现细节的。每当有新产品要加入的时候就要去修改工厂类,在工厂模式中,这个实例化的细节放到了子工厂类中去做,这个工厂变成了接口工厂,原来简单工厂模式中,添加一个新类的时候,需要在工厂类中添加新类的实例化逻辑,而现在只需要新增一个工厂类即可。扩展优于修改。

        在JDK中,最常见的就是集合类Collection,它里面有一个iterator接口方法,Colletcion的实现类中的ArrayList实现iterator方法是创建一个Itr()对象,而实现类LinkedList中的iterator是创建一个ListItr对象。这里面的Collection就是工厂,ArrayList和LinkedList实现iterator接口方法的过程就是实例化对象,这个过程交给了ArrayList和LinkedList这两个类。

3、抽象工厂模式

        上面的简单工厂和工厂模式都是工厂和实例有关系的,而抽象工厂模式就是打破了工厂与产品(大类)一对一的关系。一个工厂类可以生成多个大类的产品。此时的工厂变成了北京工厂,广东工厂。

 

适配器模式(行为模式)

        适配器就是一个桥梁,使两个不兼容的类或者对象兼容到一起工作

        定义:将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作。

        和装饰者模式的区别:目的不一样,适配器只是因为原有接口不兼容,然后适配器提供一个转换的作用,不会改变原有的接口;而装饰者就是为了对原有接口进行功能扩展,需要修改原来的接口

JDK  JUC中。FutureTask的参数是一个Runnable的时候,底层会RunnableAdapter适配器会把Runnable封装为Callable

public FutureTask(Callable<V> callable) {if (callable == null)throw new NullPointerException();this.callable = callable;this.state = NEW;       // ensure visibility of callable}
public FutureTask(Runnable runnable, V result) {this.callable = Executors.callable(runnable, result);this.state = NEW;       // ensure visibility of callable}

Executor.callable方法:

public static <T> Callable<T> callable(Runnable task, T result) {if (task == null)throw new NullPointerException();return new RunnableAdapter<T>(task, result);}
static final class RunnableAdapter<T> implements Callable<T> {final Runnable task;final T result;RunnableAdapter(Runnable task, T result) {this.task = task;this.result = result;}public T call() {task.run();return result;}}

观察者模式(行为模式)

        定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆可得到通知并被自动更新。

java.util包中提供了Observable类和Observer接口,其中要求,被观察者需要继承Observable类,观察则需要实现Observer接口

手写观察者模式

package ao.com;import java.util.Observable;public class HuaweiP30 extends Observable {private double money;public HuaweiP30(double money){this.money = money;}public  void setMoney(double money){if (money != this.money){setChanged();//价格改变}if (money < this.money){this.notifyObservers(money);//通知观察者并把改变后的钱带过去}}@Overridepublic String toString() {return "HuaweiP30{" +"money=" + money +'}';}
}

定义华为粉丝为观察者,并实现Observer接口,并重写update(Observable o, Object arg)方法。

package ao.com;import java.util.Observable;
import java.util.Observer;public class Fensi implements Observer {private String name;public Fensi(String name){this.name = name;}@Overridepublic void update(Observable o, Object arg) {if (o instanceof HuaweiP30){System.out.println("粉丝名为" + name + "发现华为p30降价了,新的价格为:" + arg +"元,开始购买。");}}
}
public static void main(String[] args) {HuaweiP30 huaweiP30 = new HuaweiP30(5000);Fensi a = new Fensi("张奥");Fensi b = new Fensi("小明");huaweiP30.addObserver(a);huaweiP30.addObserver(b);huaweiP30.setMoney(4000);}

 Spring AOP用到的代理模式。

单例模式

        一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。

class Singleton {private volatile  static Singleton singleton;private Singleton(){};public static Singleton getInstance(){if (singleton == null){synchronized (Singleton.class){if (singleton == null){singleton = new Singleton();}}}return singleton;}
}


http://www.ppmy.cn/news/458449.html

相关文章

android硬编码缩放视频,Android硬编码视频压缩变速

VideoProcessor(https://github.com/yellowcath/VideoProcessor)使用Android原生的MediaCodec实现视频压缩、剪辑、混音、快慢放及倒流的功能(快慢放及倒流支持音频同步变化)&#xff0c;在支持MediaCodec的手机上优于使用FFmpeg的方案 体积小 &#xff1a;编译后的aar只有262K…

android硬编码缩放视频,Android硬编码实现视频压缩及变速

VideoProcessor VideoProcessor使用Android原生的MediaCodec实现视频压缩、剪辑、混音、快慢放及倒流的功能(快慢放及倒流支持音频同步变化),在支持MediaCodec的手机上优于使用FFmpeg的方案 体积小 :编译后的aar只有262K,ffmpeg一个so就7、8M,精简之后也差不多还有一半大小…

90后小伙云上打造倾诉社交平台

2019独角兽企业重金招聘Python工程师标准>>> 版权声明&#xff1a;本文由孙峰原创文章&#xff0c;转载请注明出处: 文章原文链接&#xff1a;https://www.qcloud.com/community/article/143 来源&#xff1a;腾云阁 https://www.qcloud.com/community 创了业才发现…

HUAWEI P40 Pro评测:对影像偏执的苛求,颠覆了我对一台旗舰固有的认知

在未来的很长一段时间里&#xff0c;它都将作为主力机出现在我的生活中&#xff0c;当朋友询问我是否有一台值得入手的智能旗舰时&#xff0c;我会毫不犹豫的说出它的名字。没错&#xff0c;这些都是我在上手体验过HUAWEIP40Pro之后做出的决定。当我现在坐下来&#xff0c;开始…

Android7.0的xposed框架,Android 7.x 安装Xposed框架

简介&下载地址 简介就不写了吧,但是注意以下操作不是所有手机都能正常运行,有可能会刷坏系统。而且7.0上xposed本来兼容性就有问题。所以请慎重。我的手机是华为P9,Android7.0系统。 进入官网后仔细阅读,上面5.0以上和4.x版本用的xposed是不一样的。5.0以上点击5.0以上…

Appium自动化测试实例

## appium自动化完整案例 实现过程&#xff1a;   1.使用环境   appium 、安卓SDK 、python   本文重点是自动化实例&#xff0c;环境搭建过程省略。   如果对环境搭建以及安装请参考往期&#xff1b;   2.找到被测APP的包名和Activity Name   手机连接上电脑后&a…

python实验报告内容实现购物车系统_Python 实践--购物车功能简单实现

实验环境&#xff1a; operating system&#xff1a; Centos 6.3 Python version&#xff1a;Python 2.6.6 知识点&#xff1a; Python 基本数据类型的常用操作 #!/usr/bin/env python # -*- coding:utf-8 -*- # __author__ "ht" #手机信息存放在字典中{手机…

python发送邮件并返回提示_python 生成测试报告并发送邮件

前言&#xff1a; 使用unittest编写自动化测试脚本&#xff0c;执行脚本后可以很方便看到测试用例的执行情况。 但如果想向领导汇报工作&#xff0c;就需要提供更直观的测试报告。 思路&#xff1a; 使用unittest编写测试用例&#xff0c;HTMLTestRunner生成测试报告&#xff0…