Java创建型设计模式详解
发布时间: 2024-02-28 15:07:30 阅读量: 52 订阅数: 35 ![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![RAR](https://csdnimg.cn/release/download/static_files/pc/images/minetype/RAR.png)
设计模式之创建型模式
![star](https://csdnimg.cn/release/wenkucmsfe/public/img/star.98a08eaa.png)
# 1. 介绍
## 1.1 设计模式概述
设计模式是软件开发中常用的解决方案,它提供了一套经过验证的通用设计问题的解决方案。设计模式帮助开发人员更高效地解决常见的设计挑战,同时也提高了代码的可维护性和可重用性。
## 1.2 创建型设计模式概念
创建型设计模式关注对象的创建机制,包括对象实例化的方式和对象组合的方式。这些模式主要用来减少系统中对象创建的复杂度,帮助处理对象的创建和组合。
## 1.3 Java中设计模式的重要性
在Java中,设计模式发挥着重要作用,能够帮助开发人员编写清晰、可维护的代码。Java语言本身在设计上就广泛使用了各种设计模式,因此对设计模式的理解和应用对于Java开发人员来说尤为重要。设计模式可以帮助开发人员更好地理解和使用Java语言特性,从而提高代码的质量和效率。
# 2. 工厂方法模式
工厂方法模式是一种常用的创建型设计模式,它在实际项目中被广泛应用。下面将详细介绍工厂方法模式的概念、实现方式以及在Java中的应用场景和案例。
### 2.1 工厂方法模式概述
工厂方法模式属于创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定实例化哪个类。这样在工厂方法模式下,一个类的构造实例可以推迟到子类中去实现,从而实现对扩展开放,对修改关闭的原则。
### 2.2 工厂方法模式的实现方式
在工厂方法模式中,通常包含一个抽象工厂类和具体的工厂子类,每个具体的工厂子类对应创建一个具体的产品对象。这样在客户端代码中只需关心使用哪个工厂即可,具体的产品对象创建细节被封装在具体工厂类中。
以下是一个简单的工厂方法模式的示例代码:
```java
// 抽象产品
interface Product {
void show();
}
// 具体产品A
class ConcreteProductA implements Product {
@Override
public void show() {
System.out.println("This is product A");
}
}
// 具体产品B
class ConcreteProductB implements Product {
@Override
public void show() {
System.out.println("This is product B");
}
}
// 抽象工厂
interface Factory {
Product createProduct();
}
// 具体工厂A
class ConcreteFactoryA implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
// 具体工厂B
class ConcreteFactoryB implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.show();
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.show();
}
}
```
### 2.3 Java中工厂方法模式的应用场景和案例
工厂方法模式适用于需要大量创建某一类对象实例的场景,同时也方便扩展和维护。在Java中,工厂方法模式经常用于替代直接new对象的方式,尤其是在涉及到接口或抽象类的情况下,能够提供更灵活的解决方案。例如在Spring框架中,Bean的创建就使用了工厂方法模式。
这就是工厂方法模式在Java中的基本概念、实现方式以及应用场景和案例。通过工厂方法模式,我们可以更好地组织和管理对象的创建过程,使代码更具扩展性和灵活性。
# 3. 抽象工厂模式
#### 3.1 抽象工厂模式概述
抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。在抽象工厂模式中,客户端不需要关心所创建的对象是如何创建的,只需要关心它们是如何相互配合的。
#### 3.2 抽象工厂模式与工厂方法模式的区别
抽象工厂模式与工厂方法模式有一定的区别。工厂方法模式主要关注单一的产品等级结构,而抽象工厂模式则关注多个产品等级结构。在工厂方法模式中,每个具体工厂类只负责创建单一的产品,而在抽象工厂模式中,每个具体工厂类可以创建多个不同等级的产品。
#### 3.3 Java中抽象工厂模式的实现和应用
在Java中,抽象工厂模式通常通过创建一个接口来表示工厂,再由具体的工厂类实现该接口,并负责创建产品。每个具体的工厂类可以创建一组相关的产品,这些产品可以是接口的实现类。
```java
// 抽象产品接口
interface Button {
void display();
}
// 具体产品类A
class SpringButton implements Button {
@Override
public void display() {
System.out.println("显示浅绿色按钮");
}
}
// 具体产品类B
class SummerButton implements Button {
@Override
public void display() {
System.out.println("显示浅蓝色按钮");
}
}
// 抽象工厂接口
interface SkinFactory {
Button createButton();
}
// 具体工厂类1
class SpringSkinFactory implements SkinFactory {
@Override
public Button createButton() {
return new SpringButton();
}
}
// 具体工厂类2
class SummerSkinFactory implements SkinFactory {
@Override
public Button createButton() {
return new SummerButton();
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
SkinFactory factoryA = new SpringSkinFactory();
Button buttonA = factoryA.createButton();
buttonA.display();
SkinFactory factoryB = new SummerSkinFactory();
Button buttonB = factoryB.createButton();
buttonB.display();
}
}
```
上面的代码演示了抽象工厂模式在Java中的实现方式。通过定义抽象产品接口,具体产品类实现该接口;定义抽象工厂接口,具体工厂类实现该接口并创建产品。客户端根据需要选择具体的工厂类来创建相应的产品,从而实现不同风格皮肤下的UI界面。
# 4. 单例模式
在软件开发中,单例模式是一种常见的设计模式,其核心思想是确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式有两种常见的实现方式:饿汉式和懒汉式。
#### 4.1 单例模式概述
单例模式的主要目的是确保一个类在任何情况下都只有一个实例,并提供一个全局的访问点来访问这个实例。这在需要控制某些资源的访问权限或者在系统中某个对象只应该存在一个实例时非常有用。
#### 4.2 饿汉式和懒汉式单例模式实现
**饿汉式单例模式:**
```java
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
```
**懒汉式单例模式:**
```java
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
```
#### 4.3 Java中单例模式的线程安全性讨论
在上面的示例中,饿汉式单例模式是线程安全的,因为在类加载的时候就会创建实例,不存在多线程竞争的情况。而懒汉式单例模式在多线程环境下可能会创建多个实例,可以通过双重检查锁或者静态内部类的方式来保证线程安全性。
总结:单例模式是一种常见的创建型设计模式,可以确保一个类只有一个实例,并提供全局访问点。在Java中,可以通过饿汉式或者懒汉式来实现单例模式,需要根据实际情况选择合适的方式来保证线程安全性。
# 5. 建造者模式
## 5.1 建造者模式概述
建造者模式是一种对象创建型模式,它能够将构建复杂对象的过程和表示分离,从而使相同的构建过程可以创建不同的表示。该模式主要包含四个角色:产品(Product)、抽象建造者(Builder)、具体建造者(ConcreteBuilder)和指挥者(Director)。
## 5.2 建造者模式的实现步骤
1. 定义产品类,确定需要创建的复杂对象的基本结构和组成部分。
2. 创建抽象建造者接口,声明构建产品各个部分的方法。
3. 创建具体建造者类,实现抽象建造者接口,定义具体的构建细节。
4. 创建指挥者类,负责调用具体建造者的方法来构建产品。
5. 客户端调用指挥者来创建产品对象,无需知道具体的构建细节。
## 5.3 Java中建造者模式的实际应用案例
```java
// 产品类
class Product {
private String partA;
private String partB;
private String partC;
public void setPartA(String partA) {
this.partA = partA;
}
public void setPartB(String partB) {
this.partB = partB;
}
public void setPartC(String partC) {
this.partC = partC;
}
public void show() {
System.out.println("PartA: " + partA);
System.out.println("PartB: " + partB);
System.out.println("PartC: " + partC);
}
}
// 抽象建造者
interface Builder {
void buildPartA();
void buildPartB();
void buildPartC();
Product getResult();
}
// 具体建造者
class ConcreteBuilder implements Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.setPartA("PartA");
}
@Override
public void buildPartB() {
product.setPartB("PartB");
}
@Override
public void buildPartC() {
product.setPartC("PartC");
}
@Override
public Product getResult() {
return product;
}
}
// 指挥者
class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Product construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
Product product = director.construct();
product.show();
}
}
```
在上述案例中,客户端通过指挥者(Director)来创建产品对象,无需关心具体的构建细节。具体的构建过程由具体建造者(ConcreteBuilder)完成,然后返回最终的产品(Product)对象。这种建造者模式的设计使得对象的构建过程和表示分离,能够灵活地构建不同的产品对象。
# 6. 原型模式
### 6.1 原型模式概述
原型模式是一种创建型设计模式,其核心思想是通过复制现有对象来创建新对象,而不是通过实例化类进行创建。通过原型模式,我们可以在运行时动态地构建新对象,而且不需要知晓具体创建细节。
### 6.2 Java中原型模式的实现方式
在 Java 中实现原型模式通常需要使用 Cloneable 接口和重写 clone 方法。Cloneable 接口是一个标记接口,表明该对象支持复制操作,同时我们需要在实现类中重写 clone 方法来实现对象的复制。
```java
// 定义实现 Cloneable 接口的原型类
class Prototype implements Cloneable {
@Override
public Prototype clone() {
try {
return (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
// 添加业务方法
public void doOperation() {
System.out.println("Doing some operations...");
}
}
// 使用原型类创建新对象
public class PrototypePatternDemo {
public static void main(String[] args) {
Prototype original = new Prototype();
Prototype clone = original.clone();
original.doOperation();
clone.doOperation();
}
}
```
### 6.3 原型模式的适用场景和注意事项
原型模式适用于以下场景:
- 当创建对象的过程较为复杂且频繁时,可以通过复制现有对象来提高性能。
- 当需要避免初始化过程的耗时操作时,可以使用原型模式。
需要注意的是:
- 在使用原型模式时,要确保对象内部包含的所有成员变量都是基本数据类型或者可以被克隆的类型。
- 注意深拷贝和浅拷贝的区别,确保对象的深度复制。
通过原型模式,我们可以实现对象的复制,节省对象创建的时间,提高系统的性能和灵活性。
0
0
相关推荐
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)