当前位置:首页 > 技术 > 正文内容

面向对象设计原则与创建型模式解析

访客 技术 2026年5月31日 1

六大核心设计原则

单一职责原则(SRP) 一个类应仅承担一项明确职责。例如,在用户管理系统中,将数据存储逻辑与权限验证逻辑分离,分别由独立的类处理,提升代码可维护性。

开闭原则(OCP) 系统模块应支持扩展而不修改原有代码。通过抽象接口定义行为,具体实现通过继承或组合方式扩展,避免对已有逻辑进行直接更改。

依赖倒置原则(DIP) 高层组件不应依赖低层组件,两者均应依赖于抽象。即"依赖抽象而非具体实现",从而降低模块间的耦合度,增强系统的灵活性。

里氏替换原则(LSP) 子类对象可以替代父类对象而程序行为不变。这意味着子类应在不破坏父类功能的前提下进行功能增强,禁止重写或改变父类已有行为。

接口隔离原则(ISP) 应避免定义庞大、冗余的接口。应根据实际使用需求,将接口拆分为多个小而专注的接口,使实现类只需关注其真正需要的方法。

迪米特法则(LOD) 一个类应尽量减少与其他类的直接交互。只与直接关联的对象通信,隐藏内部细节。例如,在部门管理中,应通过员工类提供的公共方法获取信息,而非直接访问其私有字段。

创建型设计模式

单例模式 确保某个类在整个应用中仅有一个实例,并提供全局访问点。

  1. 饿汉式:类加载时即创建实例,线程安全但资源可能提前占用。
  2. 懒汉式(同步):首次调用时创建实例,使用 synchronized 保证线程安全。
  3. 枚举实现:利用枚举类型天然的唯一性,简洁且防反射、反序列化攻击。

简单工厂模式 通过一个统一的工厂类负责对象创建,客户端无需关心具体实现。适用于产品种类较少且相对固定的场景。

public interface Vehicle {
    void start();
}

public class Car implements Vehicle {
    @Override
    public void start() {
        System.out.println("Car engine started.");
    }
}

public class Motorcycle implements Vehicle {
    @Override
    public void start() {
        System.out.println("Motorcycle engine started.");
    }
}

public class VehicleFactory {
    public static Vehicle create(String type) {
        switch (type.toLowerCase()) {
            case "car": return new Car();
            case "motorcycle": return new Motorcycle();
            default: throw new IllegalArgumentException("Unknown vehicle type");
        }
    }
}

工厂方法模式 定义一个创建对象的接口,由子类决定实例化哪个类。适用于产品族结构复杂、未来可能新增类型的情况。

public abstract class VehicleFactory {
    public abstract Vehicle createVehicle();
}

public class CarFactory extends VehicleFactory {
    @Override
    public Vehicle createVehicle() {
        return new Car();
    }
}

public class BikeFactory extends VehicleFactory {
    @Override
    public Vehicle createVehicle() {
        return new Motorcycle();
    }
}

抽象工厂模式 用于创建一组相关或相互依赖的产品族。通过抽象工厂接口统一管理多个产品的创建。

public interface ProductFactory {
    Vehicle makeVehicle();
    Accessory makeAccessory();
}

public class LuxuryVehicleFactory implements ProductFactory {
    @Override
    public Vehicle makeVehicle() {
        return new Car();
    }

    @Override
    public Accessory makeAccessory() {
        return new PremiumAccessory();
    }
}

建造者模式 用于构建复杂对象,将构造过程分步骤进行,支持灵活配置。特别适合参数多、可选属性丰富的场景。

public class Order {
    private String customer;
    private String product;
    private int quantity;
    private boolean express;

    private Order(Builder builder) {
        this.customer = builder.customer;
        this.product = builder.product;
        this.quantity = builder.quantity;
        this.express = builder.express;
    }

    public static class Builder {
        private String customer;
        private String product;
        private int quantity = 1;
        private boolean express = false;

        public Builder setCustomer(String customer) {
            this.customer = customer;
            return this;
        }

        public Builder setProduct(String product) {
            this.product = product;
            return this;
        }

        public Builder setQuantity(int quantity) {
            this.quantity = quantity;
            return this;
        }

        public Builder setExpress(boolean express) {
            this.express = express;
            return this;
        }

        public Order build() {
            return new Order(this);
        }
    }

    @Override
    public String toString() {
        return "Order{" +
                "customer='" + customer + '\'' +
                ", product='" + product + '\'' +
                ", quantity=" + quantity +
                ", express=" + express +
                '}';
    }
}

原型模式 通过复制现有实例来创建新对象,避免重复初始化操作。适用于创建成本高或状态复杂的对象。

  • 浅克隆:复制对象本身,引用类型仍指向原对象。
  • 深克隆:递归复制所有嵌套对象,形成完全独立副本。
public abstract class Document implements Cloneable {
    protected String title;
    protected String content;

    public abstract void display();

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone(); // 浅克隆
    }
}

public class Report extends Document {
    @Override
    public void display() {
        System.out.println("Displaying report: " + title);
    }
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。