当前位置:

首页 > 编程开发 > 了解Java设计模式:常用的7种设计模式简介

了解Java设计模式:常用的7种设计模式简介

了解Java设计模式:常用的7种设计模式简介,需要具体代码示例Java设计模式是一种解决软件设计问题的通用解决方案,它提供了一套被广泛接受的设计思想与行为准则。设计模式帮助我们更好地组织和规划代码结构,使得代码具有更好的可维护性、可读性和可扩展性。在本文中,我们将介绍Java中常用的7种设计模式,并提供相应的代码示例。单例模式(SingletonPatte

本文目录

    了解Java设计模式:常用的7种设计模式简介,需要具体代码示例

    Java设计模式是一种解决软件设计问题的通用解决方案,它提供了一套被广泛接受的设计思想与行为准则。设计模式帮助我们更好地组织和规划代码结构,使得代码具有更好的可维护性、可读性和可扩展性。在本文中,我们将介绍Java中常用的7种设计模式,并提供相应的代码示例。

    1. 单例模式(Singleton Pattern):
      单例模式保证一个类只有一个实例,并提供一个全局访问点。这在需要共享资源或限制对象个数的场景中非常有用。下面是一个单例模式的代码示例:
    public class Singleton {
    
        private static Singleton instance;
    
        private Singleton() {
            // 私有构造函数,防止外部实例化
        }
    
        public static Singleton getInstance() {
            if (instance == null) {
                synchronized (Singleton.class) {
                    if (instance == null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    1. 工厂模式(Factory Pattern):
      工厂模式通过一个工厂类来创建对象,封装了对象的创建过程。这可以隐藏对象的具体实现细节,使得客户端的代码更加简洁和可扩展。下面是一个工厂模式的代码示例:
    public interface Shape {
        void draw();
    }
    
    public class Circle implements Shape {
        @Override
        public void draw() {
            System.out.println("Circle::draw()");
        }
    }
    
    public class Rectangle implements Shape {
        @Override
        public void draw() {
            System.out.println("Rectangle::draw()");
        }
    }
    
    public class ShapeFactory {
        public Shape getShape(String shapeType) {
            if (shapeType == null) {
                return null;
            }
            if (shapeType.equalsIgnoreCase("CIRCLE")) {
                return new Circle();
            } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
                return new Rectangle();
            }
            return null;
        }
    }
    1. 观察者模式(Observer Pattern):
      观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生变化时,依赖于它的其他对象将自动更新。这在事件驱动、发布-订阅,以及GUI开发中非常有用。下面是一个观察者模式的代码示例:
    import java.util.ArrayList;
    import java.util.List;
    
    public class Subject {
        private List observers = new ArrayList<>();
        private int state;
    
        public int getState() {
            return state;
        }
    
        public void setState(int state) {
            this.state = state;
            notifyAllObservers();
        }
    
        public void attach(Observer observer) {
            observers.add(observer);
        }
    
        public void notifyAllObservers() {
            for (Observer observer : observers) {
                observer.update();
            }
        }
    }
    
    public abstract class Observer {
        protected Subject subject;
        public abstract void update();
    }
    
    public class BinaryObserver extends Observer {
        public BinaryObserver(Subject subject) {
            this.subject = subject;
            this.subject.attach(this);
        }
    
        public void update() {
            System.out.println("Binary String: " + Integer.toBinaryString(subject.getState()));
        }
    }
    
    public class OctalObserver extends Observer {
        public OctalObserver(Subject subject) {
            this.subject = subject;
            this.subject.attach(this);
        }
    
        public void update() {
            System.out.println("Octal String: " + Integer.toOctalString(subject.getState()));
        }
    }
    
    public class HexObserver extends Observer {
        public HexObserver(Subject subject) {
            this.subject = subject;
            this.subject.attach(this);
        }
    
        public void update() {
            System.out.println("Hex String: " + Integer.toHexString(subject.getState()));
        }
    }
    
    public class ObserverPatternDemo {
        public static void main(String[] args) {
            Subject subject = new Subject();
            new BinaryObserver(subject);
            new OctalObserver(subject);
            new HexObserver(subject);
    
            System.out.println("First state change: 15");
            subject.setState(15);
            System.out.println("Second state change: 10");
            subject.setState(10);
        }
    }
    1. 建造者模式(Builder Pattern):
      建造者模式通过将对象的构建过程分离,使得相同的构建过程可用于创建不同的表示。这可以提高代码的灵活性和可读性,并且可以避免构建参数过多的问题。下面是一个建造者模式的代码示例:
    public class Computer {
        private String cpu;
        private String memory;
        private String disk;
        // 省略其他属性和方法
    }
    
    public interface ComputerBuilder {
        ComputerBuilder setCpu(String cpu);
        ComputerBuilder setMemory(String memory);
        ComputerBuilder setDisk(String disk);
        Computer build();
    }
    
    public class BasicComputerBuilder implements ComputerBuilder {
        private Computer computer;
    
        public BasicComputerBuilder() {
            computer = new Computer();
        }
    
        public ComputerBuilder setCpu(String cpu) {
            computer.setCpu(cpu);
            return this;
        }
    
        public ComputerBuilder setMemory(String memory) {
            computer.setMemory(memory);
            return this;
        }
    
        public ComputerBuilder setDisk(String disk) {
            computer.setDisk(disk);
            return this;
        }
    
        public Computer build() {
            return computer;
        }
    }
    
    public class Director {
        private ComputerBuilder computerBuilder;
    
        public Director(ComputerBuilder computerBuilder) {
            this.computerBuilder = computerBuilder;
        }
    
        public Computer construct() {
            return computerBuilder
                    .setCpu("i5")
                    .setMemory("8GB")
                    .setDisk("1TB")
                    .build();
        }
    }
    
    public class BuilderPatternDemo {
        public static void main(String[] args) {
            ComputerBuilder computerBuilder = new BasicComputerBuilder();
            Director director = new Director(computerBuilder);
            Computer computer = director.construct();
    
            System.out.println(computer.toString());
        }
    }
    1. 原型模式(Prototype Pattern):
      原型模式通过复制现有对象来创建新对象,而不是重新创建。这可以提高对象的创建效率,尤其是在对象的初始化过程比较复杂时。下面是一个原型模式的代码示例:
    public abstract class Shape implements Cloneable {
        private String id;
        protected String type;
        
        abstract void draw();
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
        
        public Object clone() {
            Object clone = null;
            try {
                clone = super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return clone;
        }
    }
    
    public class Circle extends Shape {
        public Circle() {
            type = "Circle";
        }
    
        public void draw() {
            System.out.println("Inside Circle::draw() method.");
        }
    }
    
    public class Rectangle extends Shape {
        public Rectangle() {
            type = "Rectangle";
        }
    
        public void draw() {
            System.out.println("Inside Rectangle::draw() method.");
        }
    }
    
    public class ShapeCache {
        private static Map shapeMap = new HashMap<>();
    
        public static Shape getShape(String shapeId) {
            Shape cachedShape = shapeMap.get(shapeId);
            return (Shape) cachedShape.clone();
        }
    
        public static void loadCache() {
            Circle circle = new Circle();
            circle.setId("1");
            shapeMap.put(circle.getId(), circle);
    
            Rectangle rectangle = new Rectangle();
            rectangle.setId("2");
            shapeMap.put(rectangle.getId(), rectangle);
        }
    }
    
    public class PrototypePatternDemo {
        public static void main(String[] args) {
            ShapeCache.loadCache();
    
            Shape clonedShape1 = ShapeCache.getShape("1");
            System.out.println("Shape: " + clonedShape1.getType());
    
            Shape clonedShape2 = ShapeCache.getShape("2");
            System.out.println("Shape: " + clonedShape2.getType());
        }
    }
    1. 适配器模式(Adapter Pattern):
      适配器模式将一个类的接口转换成客户端所期望的另一个接口。这可以在不改变现有代码的情况下,为不兼容的接口之间提供协同工作的能力。下面是一个适配器模式的代码示例:
    public interface MediaPlayer {
        void play(String audioType, String fileName);
    }
    
    public interface AdvancedMediaPlayer {
        void playVlc(String fileName);
    
        void playMp4(String fileName);
    }
    
    public class VlcPlayer implements AdvancedMediaPlayer {
        public void playVlc(String fileName) {
            System.out.println("Playing vlc file. Name: " + fileName);
        }
    
        public void playMp4(String fileName) {
            // 空实现
        }
    }
    
    public class Mp4Player implements AdvancedMediaPlayer {
        public void playVlc(String fileName) {
            // 空实现
        }
    
        public void playMp4(String fileName) {
            System.out.println("Playing mp4 file. Name: " + fileName);
        }
    }
    
    public class MediaAdapter implements MediaPlayer {
        AdvancedMediaPlayer advancedMediaPlayer;
    
        public MediaAdapter(String audioType) {
            if (audioType.equalsIgnoreCase("vlc")) {
                advancedMediaPlayer = new VlcPlayer();
            } else if (audioType.equalsIgnoreCase("mp4")) {
                advancedMediaPlayer = new Mp4Player();
            }
        }
    
        public void play(String audioType, String fileName) {
            if (audioType.equalsIgnoreCase("vlc")) {
                advancedMediaPlayer.playVlc(fileName);
            } else if (audioType.equalsIgnoreCase("mp4")) {
                advancedMediaPlayer.playMp4(fileName);
            }
        }
    }
    
    public class AudioPlayer implements MediaPlayer {
        MediaAdapter mediaAdapter;
    
        public void play(String audioType, String fileName) {
            if (audioType.equalsIgnoreCase("mp3")) {
                System.out.println("Playing mp3 file. Name: " + fileName);
            } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
                mediaAdapter = new MediaAdapter(audioType);
                mediaAdapter.play(audioType, fileName);
            } else {
                System.out.println("Invalid media. " + audioType + " format not supported");
            }
        }
    }
    
    public class AdapterPatternDemo {
        public static void main(String[] args) {
            AudioPlayer audioPlayer = new AudioPlayer();
            audioPlayer.play("mp3", "beyond_the_horizon.mp3");
            audioPlayer.play("mp4", "alone.mp4");
            audioPlayer.play("vlc", "far_far_away.vlc");
            audioPlayer.play("avi", "mind_me.avi");
        }
    }
    1. 策略模式(Strategy Pattern):
      策略模式定义了一系列的算法,并将每个算法封装起来,使得它们可以互相替换。这样可以方便地切换算法或扩展新的算法,而不影响其他部分的代码。下面是一个策略模式的代码示例:
    public interface Strategy {
        int doOperation(int num1, int num2);
    }
    
    public class OperationAdd implements Strategy {
        public int doOperation(int num1, int num2) {
            return num1 + num2;
        }
    }
    
    public class OperationSubtract implements Strategy {
        public int doOperation(int num1, int num2) {
            return num1 - num2;
        }
    }
    
    public class OperationMultiply implements Strategy {
        public int doOperation(int num1, int num2) {
            return num1 * num2;
        }
    }
    
    public class Context {
        private Strategy strategy;
    
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
    
        public int executeStrategy(int num1, int num2) {
            return strategy.doOperation(num1, num2);
        }
    }
    
    public class StrategyPatternDemo {
        public static void main(String[] args) {
            Context context = new Context(new OperationAdd());
            System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
    
            context = new Context(new OperationSubtract());
            System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
    
            context = new Context(new OperationMultiply());
            System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
        }
    }

    通过以上示例代码,我们对Java中常用的7种设计模式进行了简单的介绍。每一种设计模式都有不同的场景和应用,它们可以在不同的项目中发挥作用。希望这篇文章可以帮助你了解并应用设计模式,并提升你的代码质量和开发效率。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Yandex官网入口及网页搜索使用方法
    Yandex官网入口及网页搜索使用方法

    Yandex官网入口是https://www.yondex.net/,该平台支持多语言切换、智能搜索匹配、虚拟键盘变更及实时翻译,提供地图、图片、新闻、购物等垂直服务,并具备账户同步、隐私管理、个性化首页和云存储等功能。

    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。