当前位置: 首页 > news >正文

设计模式-简单工厂策略装饰器代理

设计模式概述 - 简单工厂 & 策略 & 装饰器 & 代理

简单工厂模式简述

简单工厂模式(Simple Factory Pattern)是一种创建对象的设计模式,属于创建型模式。它通过一个工厂类来创建不同类型的对象,而不需要在客户端代码中直接使用 new 关键字。这样可以将对象的创建和使用分离,提高代码的灵活性和可维护性。

主要角色

  1. 工厂类:负责创建产品对象。
  2. 产品接口:定义产品的基本行为。
  3. 具体产品:实现产品接口的具体类。

优点

  • 降低耦合:客户端代码不需要关心具体的产品类,只需要依赖于产品接口。
  • 易于扩展:增加新产品时只需创建新的具体产品类和更新工厂类。

缺点

  • 违反开闭原则:每次增加新产品时需要修改工厂类。
  • 工厂类职责过重:工厂类可能会变得复杂,承担过多的责任。

示例代码(Java)

// 产品接口
interface Product {void use();
}// 具体产品A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("使用产品A");}
}// 具体产品B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("使用产品B");}
}// 工厂类
class SimpleFactory {public static Product createProduct(String type) {switch (type) {case "A":return new ConcreteProductA();case "B":return new ConcreteProductB();default:throw new IllegalArgumentException("未知产品类型");}}
}// 客户端代码
public class Client {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.use();Product productB = SimpleFactory.createProduct("B");productB.use();}
}

策略模式简述

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互换。策略模式使得算法的变化独立于使用算法的客户。

主要角色

  1. 上下文(Context):持有一个策略类的引用,并且可以在运行时切换策略。
  2. 策略接口(Strategy):定义一个公共接口,所有具体策略类都要实现这个接口。
  3. 具体策略(ConcreteStrategy):实现策略接口的具体算法。

优点

  • 开放/封闭原则:可以在不修改上下文的情况下添加新策略。
  • 避免使用多重条件语句:通过策略模式可以消除复杂的条件语句。

缺点

  • 客户端需要知道所有的策略:客户端需要了解所有可用的策略。
  • 增加了对象的数量:每个策略都需要一个具体的类,可能会增加系统的复杂性。

示例代码(Java)

// 策略接口
interface Strategy {int doOperation(int num1, int num2);
}// 具体策略A
class Addition implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}// 具体策略B
class Subtraction implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}// 具体策略C
class Multiplication implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}
}// 上下文
class Context {private Strategy strategy;public void setStrategy(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int num1, int num2) {return strategy.doOperation(num1, num2);}
}// 客户端代码
public class Client {public static void main(String[] args) {Context context = new Context();// 使用加法策略context.setStrategy(new Addition());System.out.println("10 + 5 = " + context.executeStrategy(10, 5));// 使用减法策略context.setStrategy(new Subtraction());System.out.println("10 - 5 = " + context.executeStrategy(10, 5));// 使用乘法策略context.setStrategy(new Multiplication());System.out.println("10 * 5 = " + context.executeStrategy(10, 5));}
}

装饰器模式简述

装饰器模式(Decorator Pattern)是一种结构型设计模式,允许用户在不改变对象结构的情况下,动态地添加功能。该模式通过创建一个装饰类来包装原有类,从而提供额外的功能。

主要角色

  1. 组件(Component)

    • 定义一个接口,用于实现对象和装饰器的共同接口。
  2. 具体组件(ConcreteComponent)

    • 实现了组件接口的具体类,表示被装饰的对象。
  3. 装饰器(Decorator)

    • 也是实现了组件接口的抽象类,持有一个组件对象的引用,用于在其上添加额外的功能。
  4. 具体装饰器(ConcreteDecorator)

    • 继承自装饰器类,提供具体的装饰功能。

示例代码

// 组件接口
interface Coffee {String getDescription();double cost();
}// 具体组件
class SimpleCoffee implements Coffee {@Overridepublic String getDescription() {return "Simple Coffee";}@Overridepublic double cost() {return 5.0;}
}// 装饰器抽象类
abstract class CoffeeDecorator implements Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee = coffee;}@Overridepublic String getDescription() {return decoratedCoffee.getDescription();}@Overridepublic double cost() {return decoratedCoffee.cost();}
}// 具体装饰器
class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return decoratedCoffee.getDescription() + ", Milk";}@Overridepublic double cost() {return decoratedCoffee.cost() + 1.5;}
}// 具体装饰器
class SugarDecorator extends CoffeeDecorator {public SugarDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return decoratedCoffee.getDescription() + ", Sugar";}@Overridepublic double cost() {return decoratedCoffee.cost() + 0.5;}
}// 使用示例
public class DecoratorPatternExample {public static void main(String[] args) {Coffee coffee = new SimpleCoffee();System.out.println(coffee.getDescription() + " $" + coffee.cost());coffee = new MilkDecorator(coffee);System.out.println(coffee.getDescription() + " $" + coffee.cost());coffee = new SugarDecorator(coffee);System.out.println(coffee.getDescription() + " $" + coffee.cost());}
}

代理模式简述

代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式通常用于以下几种情况:

  1. 保护代理:控制对真实对象的访问,以保护真实对象。
  2. 虚代理:延迟加载真实对象,直到需要使用它时才创建。
  3. 远程代理:为远程对象提供一个本地代理,以便在本地调用远程对象的方法。

角色

  • Subject:定义真实对象和代理对象的共同接口。
  • RealSubject:实现了Subject接口的真实对象。
  • Proxy:实现了Subject接口,持有对RealSubject的引用,并控制对其的访问。

优点

  • 控制访问:可以控制对真实对象的访问。
  • 延迟加载:可以在需要时才创建真实对象,节省资源。
  • 增强功能:可以在调用真实对象的方法前后添加额外的功能。

缺点

  • 增加复杂性:引入代理对象会增加系统的复杂性。
  • 性能开销:代理对象可能会引入额外的性能开销。

示例代码

// Subject接口
interface Subject {void request();
}// 真实对象
class RealSubject implements Subject {@Overridepublic void request() {System.out.println("RealSubject: Handling request.");}
}// 代理对象
class Proxy implements Subject {private RealSubject realSubject;@Overridepublic void request() {if (realSubject == null) {realSubject = new RealSubject();}// 在调用真实对象的方法之前可以添加额外的逻辑System.out.println("Proxy: Pre-processing request.");realSubject.request();// 在调用真实对象的方法之后可以添加额外的逻辑System.out.println("Proxy: Post-processing request.");}
}// 客户端代码
public class Client {public static void main(String[] args) {Subject proxy = new Proxy();proxy.request();}
}

文章转载自:

http://PODQkGWp.pdxqk.cn
http://yBWkjAF6.pdxqk.cn
http://gJMQGV02.pdxqk.cn
http://hwZIFXhO.pdxqk.cn
http://z5iQFD1d.pdxqk.cn
http://evM4yoJJ.pdxqk.cn
http://t3yWnx1e.pdxqk.cn
http://cWgmaDDL.pdxqk.cn
http://8kJXnSMq.pdxqk.cn
http://9agvT1vp.pdxqk.cn
http://jlnAflDK.pdxqk.cn
http://0rHfVkCG.pdxqk.cn
http://K4TF3ibY.pdxqk.cn
http://IUXbmCs9.pdxqk.cn
http://RkhK1ZVS.pdxqk.cn
http://222XlFgH.pdxqk.cn
http://3ZMhfaxs.pdxqk.cn
http://iZJLKEkL.pdxqk.cn
http://ZyGjWaPb.pdxqk.cn
http://Tgy7OJJy.pdxqk.cn
http://ITdFmamH.pdxqk.cn
http://LeOWK8nP.pdxqk.cn
http://UXXlJJ02.pdxqk.cn
http://tD47BdzK.pdxqk.cn
http://tRpTqpQC.pdxqk.cn
http://J7n3PAx1.pdxqk.cn
http://evwvdzFD.pdxqk.cn
http://A4LtmSvs.pdxqk.cn
http://Jy9aTbBU.pdxqk.cn
http://PW4yTcBM.pdxqk.cn
http://www.dtcms.com/a/375253.html

相关文章:

  • 家庭劳务机器人发展阶段与时间预测
  • .NET 单文件程序详解:从原理到实践
  • 新能源汽车充电设备装调与检修仿真教学软件:理虚实融合实训方案
  • 小鹏汽车 vla 算法最新进展
  • C++ 20 视图view笔记
  • HTML 网页静态托管 API 接口文档(可集成到智能体Agent)
  • 在uni-app中使用lottie-web来展示Lottie动画
  • Python数据可视化基础:使用Matplotlib绘制图表
  • CodeBuddy Code深度实战:从零构建智能电商推荐系统的完整开发历程
  • 【Kubernetes知识点】PriorityClass,HPA和CICD
  • 赋能多场景创新:明远智睿H618核心板
  • (C++)数据结构初阶(顺序表的实现)
  • 一手实测,文心x1.1的升级很惊喜啊
  • 【系统分析师】第18章-关键技术:移动应用系统分析与设计(核心总结)
  • echarts 实现柱状图自动滚动展示数据(Vue3)
  • 基于Python的购物商城网站电商管理系统【2026最新】
  • Electron 分发策略:创建安装程序与自动更新
  • IAR 集成开发环境入门指南:字体设置与调试实战
  • CentOS7下Ceph集群部署实战
  • 逆元,除法同余,容斥原理笔记
  • 【springboot+vue】党员党建活动管理平台(源码+文档+调试+基础修改+答疑)
  • JAVA 面试 MySQL
  • 【Pandas】3.2-数据预处理:行的基本操作
  • 【展厅多媒体】 AI人工智能赋能虚拟数字展厅应用与制作
  • Python入门教程之逻辑运算符
  • 构建AI智能体:二十八、大语言模型BERT:原理、应用结合日常场景实践全面解析
  • pytest并发测试,资源问题导致用例失败解决办法
  • 【openEuler 24.03 LTS SP2】真实实验部署ollama0.11.6+deepseekR1:1.5b+open-webUI
  • 欢迎来到“个人产品化”时代
  • 【论文阅读】REFRAG:一个提升RAG解码效率的新思路