当前位置:首页 > 科技  > 软件

详解Java中的五种设计模式

来源: 责编: 时间:2023-09-22 20:11:19 416观看
导读设计模式是一种可重用的解决方案,用于解决软件设计中常见的问题。不同类型的设计模式针对解决不同的特定问题或问题组合。如下图所示,一些常见的设计模式类型包括处理对象创建的创建型模式;处理对象组合和组织的结构型模

wd628资讯网——每日最新资讯28at.com

本文分享几种与Java中常用的创建型设计模式相关的代码示例。wd628资讯网——每日最新资讯28at.com

创建型设计模式

创建型设计模式提供了各种对象创建机制,从而增加了现有代码的灵活性和重用性。wd628资讯网——每日最新资讯28at.com

其主要功能是以最佳方式提供非常具体的解决方案。它们可以进一步分为以下类别。wd628资讯网——每日最新资讯28at.com

1. 单例

单例是一种创建型设计模式,它确保一个类只有一个实例,并提供对该实例的全局访问点。wd628资讯网——每日最新资讯28at.com

wd628资讯网——每日最新资讯28at.com

单例模式基于对象只有一个实例的概念,从而实现对资源的全局控制。简而言之,单例设计模式确保只创建一个类的实例,并且该实例在应用程序内可以全局访问。wd628资讯网——每日最新资讯28at.com

public class SingletonClass {    private static SingletonClass instance;    private SingletonClass() {        // 私有构造函数,防止外部实例化    }    public static SingletonClass getInstance() {        if (instance == null) {            instance = new SingletonClass();        }        return instance;    }}

如下所示,当我们发送Postman请求时,控制器类和结果将是同一个实例:wd628资讯网——每日最新资讯28at.com

@RestController@RequestMapping("/api")public class SingletonController  {    private SingletonClass singletonClass;    public SingletonController(SingletonClass singletonClass) {        this.singletonClass = singletonClass;    }    @GetMapping("/singleton")    public String getSingleton() {        return "This is a singleton instance: " + singletonClass.toString();    }}

wd628资讯网——每日最新资讯28at.com

当您想要确保类仅存在一个实例时(例如,由程序的不同部分共享的单个数据库对象),您应该使用单例设计模式。wd628资讯网——每日最新资讯28at.com

2. 工厂

工厂方法是一种创建型设计模式,它提供了一种在创建过程中无需指定其具体类即可创建产品对象的解决方案。wd628资讯网——每日最新资讯28at.com

wd628资讯网——每日最新资讯28at.com

以下是Java代码示例,PaymentProcessor是定义处理付款的合同的接口。wd628资讯网——每日最新资讯28at.com

public interface PaymentProcessor {    void processPayment();}

CreditCardPaymentProcessor和PaypalPaymentProcessor是实现PaymentProcessor接口的具体类。这些类为CreditCard和PayPal付款特定的processPayment()方法提供了实现。wd628资讯网——每日最新资讯28at.com

@Servicepublic class CreditCardPaymentProcessor implements PaymentProcessor {    @Override    public void processPayment() {        // 信用卡支付交易    }}@Servicepublic class PaypalPaymentProcessor implements PaymentProcessor {    @Override    public void processPayment() {        //  PayPal支付交易    }}

PaymentProcessorFactory是实现工厂设计模式的工厂类。该类负责根据给定的付款方式创建不同PaymentProcessor实现的实例。wd628资讯网——每日最新资讯28at.com

@Componentpublic class PaymentProcessorFactory {    private final CreditCardPaymentProcessor creditCardPaymentProcessor;    private final PaypalPaymentProcessor paypalPaymentProcessor;    public PaymentProcessorFactory(CreditCardPaymentProcessor creditCardPaymentProcessor,                                   PaypalPaymentProcessor paypalPaymentProcessor) {        this.creditCardPaymentProcessor = creditCardPaymentProcessor;        this.paypalPaymentProcessor = paypalPaymentProcessor;    }    public PaymentProcessor createPaymentProcessor(String paymentMethod) {        if (paymentMethod.equalsIgnoreCase("creditcard")) {           return creditCardPaymentProcessor;        } else if (paymentMethod.equalsIgnoreCase("paypal")) {            return paypalPaymentProcessor;        }        throw new IllegalArgumentException("Invalid payment method: " + paymentMethod);    }}

入口点处理对/processPayment/{paymentMethod}的请求,并使用PaymentProcessorFactory根据提供的paymentMethod创建适当的付款处理器。这简化了代码并使添加新付款处理器变得容易。wd628资讯网——每日最新资讯28at.com

wd628资讯网——每日最新资讯28at.com

工厂方法是一种用于节省系统资源的设计模式,它通过重复使用现有对象而不是重复构建它们来实现这一目的。wd628资讯网——每日最新资讯28at.com

3. 抽象工厂

抽象工厂是一种创建型设计模式,它允许您生成相关对象系列,无需指定其具体类。wd628资讯网——每日最新资讯28at.com

wd628资讯网——每日最新资讯28at.com

以下是Java代码示例:wd628资讯网——每日最新资讯28at.com

//工厂类public interface ProductFactory {    Product createProduct();}public class ProductAFactory implements ProductFactory{    @Override    public Product createProduct() {        return new ProductA();    }}public class ProductBFactory implements ProductFactory{    @Override    public Product createProduct() {        return new ProductB();    }}
//产品类public interface Product {    String getName();}public class ProductA implements Product {    @Override    public String getName() {        return "Product A";    }}public class ProductB implements Product {    @Override    public String getName() {        return "Product B";    }}// 使用 ProductAFactory 创建产品 AProductFactory productAFactory = new ProductAFactory();Product productA = productAFactory.createProduct();System.out.println("Product A: " + productA.getName());// 使用 ProductBFactory 创建产品 BProductFactory productBFactory = new ProductBFactory();Product productB = productBFactory.createProduct();System.out.println("Product B: " + productB.getName());

抽象工厂模式在处理不同组相关项目时非常有用,它可以避免代码依赖于这些项目的特定类型。您可能事先不知道这些类型,或者希望为将来添加更多类型留出空间。这样,您的代码可以更加灵活和可扩展。wd628资讯网——每日最新资讯28at.com

4. Builder

Builder是一种创建型设计模式,它允许您以逐步构建的方式创建复杂的对象。通过使用Builder模式,您可以使用相同的构建代码来生成不同类型和表示形式的对象。这种灵活性使得对象的构建过程更加可控和可定制。wd628资讯网——每日最新资讯28at.com

wd628资讯网——每日最新资讯28at.com

以下是Java代码示例::wd628资讯网——每日最新资讯28at.com

@Builder@Getter@Setterpublic class Beer {    //必填属性    private String name;    private double drinkSize;    private double alcoholPercentage;    private double price;    // 其他属性    private String brewery;            // 生产啤酒的酿酒厂    private String countryOfOrigin;    // 啤酒原产国    private String description;        // 对啤酒特点的简要描述    private String packaging;          // 包装类型(瓶装、罐装、生啤等)    private String servingTemperature; // 推荐的饮用温度    private String foodPairing;        // 适合搭配该啤酒的食物}
@RestController@RequestMapping("/api/beers")public class BeerController {    @GetMapping("/basic")    public String createStandardBeer() {        Beer beer = Beer.builder()                .name("Standard Beer")                .drinkSize(500)                .alcoholPercentage(5.0)                .price(5.99)                .build();        return "Created beer: " + beer.getName() +                 ", Drink Size: " + beer.getDrinkSize() +                ", Alcohol Percentage: " + beer.getAlcoholPercentage() +                ", Price: " + beer.getPrice();    }    @GetMapping("/premium")    public String createPremiumBeer() {        Beer beer = Beer.builder()                .name("Sample Beer")                .drinkSize(330)                .alcoholPercentage(5.0)                .price(10.99)                .brewery("Crafty Brews")                .countryOfOrigin("United States")                .description("A refreshing lager with a smooth taste.")                .packaging("Bottle")                .servingTemperature("4-6°C")                .foodPairing("Pairs well with grilled chicken and salads.")                .build();        return "Created beer: " + beer.getName() +                 ", Drink Size: " + beer.getDrinkSize() +                ", Alcohol Percentage: " + beer.getAlcoholPercentage() +                ", Price: " + beer.getPrice() +                ", Brewery: " + beer.getBrewery() +                ", Country of Origin: " + beer.getCountryOfOrigin() +                ", Description: " + beer.getDescription() +                ", Packaging: " + beer.getPackaging() +                ", Serving Temperature: " + beer.getServingTemperature() +                ", Food Pairing: " + beer.getFoodPairing();    }}

wd628资讯网——每日最新资讯28at.com

wd628资讯网——每日最新资讯28at.com

优点:wd628资讯网——每日最新资讯28at.com

  • 减少构造函数中的参数数量并提供可读的方法调用。
  • 允许在完整状态下实例化对象。
  • 简化了不可变对象的构建过程。

缺点:wd628资讯网——每日最新资讯28at.com

  • 它会增加代码行数,但提供了设计灵活性和改进的代码可读性。
  • 需要为每种产品类型创建单独的ConcreteBuilder类。

5. 原型

原型是一种创建型设计模式,它允许您复制现有对象,而不依赖于它们的具体类。wd628资讯网——每日最新资讯28at.com

wd628资讯网——每日最新资讯28at.com

以下是Java代码示例:wd628资讯网——每日最新资讯28at.com

designpatterns└── creational    └── prototype        ├── controller        │   └── TreeController.java        ├── model        │   ├── Tree.java        │   ├── PlasticTree.java        │   └── PineTree.java        └── PrototypeDemoApplication.java
//抽象类@Getter@Setterpublic abstract class Tree implements Cloneable {    private String type;    public abstract void copy();    @Override    protected Object clone() throws CloneNotSupportedException {        return super.clone();    }}//具体类-松树public class PineTree extends Tree {    public PineTree() {        setType("Pine Tree");    }    @Override    public void copy() {        //实现    }}//具体类-塑料树  public PlasticTree() {        setType("Plastic Tree");    }    @Override    public void copy() {        //实现    }
@RestController@RequestMapping("/api/trees")public class TreeController {    @GetMapping("/plastic")    public String createPlasticTree() {        Tree plasticTree = new PlasticTree();        return "Created: " + plasticTree.getType();    }    @GetMapping("/pine")    public String createPineTree() {        Tree pineTree = new PineTree();        return "Created: " + pineTree.getType();    }}

wd628资讯网——每日最新资讯28at.com

wd628资讯网——每日最新资讯28at.com

当需要创建的新对象与现有对象仅存在轻微差异时,原型模式非常有用。通过提前设置具有正确设置的实例,我们可以在需要更多相似对象时进行复制,从而节省了创建对象的时间和资源。wd628资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-11198-0.html详解Java中的五种设计模式

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 十条建议,写出简洁专业的Java代码

下一篇: 基于Python+Flask实现一个简易网页验证码登录系统案例

标签:
  • 热门焦点
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 华为和江淮汽车合作开发百万元问界MPV?双方回应来了

    8月1日消息,郭明錤今天在社交平台发文称,华为正在和江淮汽车合作,开发售价在100万元的问界MPV,预计在2024年第2季度量产,销量目标为上市首年交付5万辆。
  • 国行版三星Galaxy Z Fold5/Z Flip5发布 售价7499元起

    2023年8月3日,三星电子举行Galaxy新品中国发布会,正式在国内推出了新一代折叠屏智能手机三星Galaxy Z Fold5与Galaxy Z Flip5,以及三星Galaxy Tab S9
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top