设计模式 (二) 创建型设计模式系列

news/2024/11/2 17:37:32/

目录

1.单例模式

2.工厂模式

3.抽象工厂模式

4.建造者模式

5.原型模式


创建型设计模式是一组用于处理对象创建的模式,包括单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式。在这个系列中,我们将介绍这些模式的使用方法和实例。

1.单例模式

单例模式确保一个类只有一个实例,并提供全局访问点。这种模式通常用于控制资源的访问,例如数据库连接池、线程池等。单例模式的实现方式有多种,最常见的是饿汉式和懒汉式。饿汉式在类加载时就创建实例,懒汉式在第一次使用时才创建实例。

下面是一个饿汉式的单例模式实现:

public class Singleton {private static final Singleton INSTANCE = new Singleton();private Singleton() {}public static Singleton getInstance() {return INSTANCE;}
}

2.工厂模式

工厂模式定义一个用于创建对象的接口,让子类决定实例化哪个类。这种模式通常用于创建复杂对象或者对象的创建过程需要根据条件动态确定的情况。

工厂模式有三种实现方式:简单工厂模式、工厂方法模式和抽象工厂模式。其中,简单工厂模式是最简单的一种实现方式,工厂方法模式和抽象工厂模式则更加灵活和扩展性强。

下面是一个简单工厂模式的实现:

public class SimpleFactory {public static Product createProduct(String type) {if ("A".equals(type)) {return new ConcreteProductA();} else if ("B".equals(type)) {return new ConcreteProductB();} else {throw new IllegalArgumentException("Invalid product type: " + type);}}
}public interface Product {void use();
}public class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using product A");}
}public class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using product B");}
}

3.抽象工厂模式

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这种模式通常用于创建一组相互依赖的对象,例如 GUI 工具包中的组件。

抽象工厂模式的实现方式比较简单,只需要定义一个抽象工厂接口和一组抽象产品接口,然后让具体工厂实现抽象工厂接口,具体产品实现抽象产品接口即可。

下面是一个抽象工厂模式的实现:

public interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}public interface ProductA {void use();
}public interface ProductB {void eat();
}public class ConcreteFactory1 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {return new ConcreteProductB1();}
}public class ConcreteFactory2 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA2();}@Overridepublic ProductB createProductB() {return new ConcreteProductB2();}
}public class ConcreteProductA1 implements ProductA {@Overridepublic void use() {System.out.println("Using product A1");}
}public class ConcreteProductA2 implements ProductA {@Overridepublic void use() {System.out.println("Using product A2");}
}public class ConcreteProductB1 implements ProductB {@Overridepublic void eat() {System.out.println("Eating product B1");}
}public class ConcreteProductB2 implements ProductB {@Overridepublic void eat() {System.out.println("Eating product B2");}
}

4.建造者模式

建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这种模式通常用于创建复杂对象,例如汽车、电脑等。

建造者模式的实现方式比较灵活,可以使用链式调用、Builder 模式等方式实现。下面是一个使用链式调用的建造者模式实现:

public class Product {private String partA;private String partB;private String partC;public Product(Builder builder) {this.partA = builder.partA;this.partB = builder.partB;this.partC = builder.partC;}public String getPartA() {return partA;}public String getPartB() {return partB;}public String getPartC() {return partC;}public static class Builder {private String partA;private String partB;private String partC;public Builder setPartA(String partA) {this.partA = partA;return this;}public Builder setPartB(String partB) {this.partB = partB;return this;}public Builder setPartC(String partC) {this.partC = partC;return this;}public Product build() {return new Product(this);}}
}

使用方法如下:

Product product = new Product.Builder().setPartA("partA").setPartB("partB").setPartC("partC").build();

5.原型模式

原型模式通过复制现有的实例来创建新的实例。这种模式通常用于创建成本较高的对象,例如数据库连接、线程等。

原型模式的实现方式比较简单,只需要让对象实现 Cloneable 接口,并重写 clone() 方法即可。

下面是一个原型模式的实现:

public class Prototype implements Cloneable {private String name;public Prototype(String name) {this.name = name;}public String getName() {return name;}@Overridepublic Prototype clone() throws CloneNotSupportedException {return (Prototype) super.clone();}
}

使用方法如下:

Prototype prototype1 = new Prototype("prototype1");
Prototype prototype2 = prototype1.clone();

以上就是创建型设计模式系列的内容,希望能够帮助你更好地理解创建型设计模式的使用方法和实例。


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

相关文章

信息收集思路

1、开发者注释 在网站前端代码中遗留的开发者注释 其中可能包含某些关键信息 ​ 💡 使用F12 、CtrlU 、view-source: 查看前端源码 ​ 3、Robots文件 爬虫协议,网站根目录存在的robots.txt文件,用于告知搜索引擎或爬虫哪些路径和页面不…

服务(第三十篇)elk-elasticsearch、logstash、kiabana

rsyslog 服务器较少时使用,rsyslog日志收集,统一存放在专门存放日志的收集器中; ELK 简介 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用…

化工生产制造企业实施技术变革前要问自己的 6 个问题

化工企业将新技术(大数据、人工智能、云计算、RFID、PDA、GIS)引入到业务中,通过填补技术基础设施中的空白来帮助企业团队成员更高效、更有效地完成工作,是一项卓有成就的事情。但是,企业在急于快速实施新解决方案以获…

相爱相杀的在线帮助文档语雀、Baklib、石墨文档,到底有何区别?

在线帮助文档是现代企业不可或缺的一部分,它提供了针对特定产品或服务的详细说明和指南,以帮助用户更好地理解产品或服务并解决问题。目前市面上有许多在线帮助文档工具,其中语雀、Baklib和石墨文档是比较受欢迎的三种,本文将对它…

QLocalSocket/QLocalServer基操

以下是使用QLocalSocket/QLocalServer进行进程间通信的具体用法&#xff1a; 1. 创建QLocalServer 在服务端进程中&#xff0c;需要创建一个QLocalServer对象&#xff0c;并监听客户端连接。示例代码如下&#xff1a; #include <QLocalServer> #include <QLocalSock…

​数据库原理及应用上机(实验二 SQL数据定义功能实验)

✨作者&#xff1a;命运之光 ✨专栏&#xff1a;数据库原理及应用上机实验 目录 ✨一、实验目的和要求 ✨二、实验内容与步骤 ✨三、附加练习 ✨四、实验总结 &#x1f353;&#x1f353;前言&#xff1a; 数据库原理及应用上机实验报告的一个简单整理后期还会不断完善&am…

C++中vector的用法

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;CSTL 前言&#xff1a;Hello各位小伙伴们好&#xff01;欢迎来到本专栏CSTL的学习&#xff0c;本专栏旨在帮助大家了解…

从开源框架到微服务架构:Spring Cloud的演进历程

从开源框架到微服务架构&#xff1a;Spring Cloud的演进历程 一、开源框架1. 开源框架的定义和背景2. 开源框架的优势与挑战3. 开源框架对软件开发的影响和发展 二、Spring框架1. Spring框架的诞生背景和发展历程2. Spring框架的特点和优势3. Spring框架在企业级应用中的应用场…