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

JAVA设计模式,工厂模式

工厂模式(Factory Pattern)是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。工厂模式的主要目的是将对象的创建逻辑封装在一个单独的方法或类中,而不是在客户端代码中直接使用`new`关键字创建对象。这样可以提高代码的灵活性和可维护性。

 

### 工厂模式的类型

 

1. **简单工厂模式(Simple Factory)**:通过一个工厂类来创建对象,但这个工厂类不是必须遵守任何接口或抽象类。

2. **工厂方法模式(Factory Method)**:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

3. **抽象工厂模式(Abstract Factory)**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

 

### 示例代码

 

#### 简单工厂模式

 

假设我们有一个应用程序,需要根据用户的选择创建不同类型的消息对象。

 

##### 消息接口

 

```java

public interface Message {

    void send();

}

```

 

##### 具体消息类

 

```java

public class EmailMessage implements Message {

    @Override

    public void send() {

        System.out.println("Sending email message.");

    }

}

 

public class SMSMessage implements Message {

    @Override

    public void send() {

        System.out.println("Sending SMS message.");

    }

}

```

 

##### 简单工厂类

 

```java

public class MessageFactory {

    public static Message createMessage(String type) {

        if ("email".equals(type)) {

            return new EmailMessage();

        } else if ("sms".equals(type)) {

            return new SMSMessage();

        } else {

            throw new IllegalArgumentException("Unknown message type: " + type);

        }

    }

}

```

 

##### 客户端

 

```java

public class Client {

    public static void main(String[] args) {

        Message email = MessageFactory.createMessage("email");

        email.send();

 

        Message sms = MessageFactory.createMessage("sms");

        sms.send();

    }

}

```

 

### 运行结果

 

```

Sending email message.

Sending SMS message.

```

 

#### 工厂方法模式

 

假设我们有一个更复杂的场景,不同的子类可以根据自己的需求创建不同的消息对象。

 

##### 抽象工厂类

 

```java

public abstract class MessageFactory {

    public abstract Message createMessage();

}

```

 

##### 具体工厂类

 

```java

public class EmailMessageFactory extends MessageFactory {

    @Override

    public Message createMessage() {

        return new EmailMessage();

    }

}

 

public class SMSMessageFactory extends MessageFactory {

    @Override

    public Message createMessage() {

        return new SMSMessage();

    }

}

```

 

##### 客户端

 

```java

public class Client {

    public static void main(String[] args) {

        MessageFactory emailFactory = new EmailMessageFactory();

        Message email = emailFactory.createMessage();

        email.send();

 

        MessageFactory smsFactory = new SMSMessageFactory();

        Message sms = smsFactory.createMessage();

        sms.send();

    }

}

```

 

### 运行结果

 

```

Sending email message.

Sending SMS message.

```

 

#### 抽象工厂模式

 

假设我们有一个更复杂的场景,需要创建一系列相关的对象,例如不同类型的邮件和短信服务。

 

##### 抽象工厂接口

 

```java

public interface MessageServiceFactory {

    Message createMessage();

    Notification createNotification();

}

```

 

##### 消息接口和通知接口

 

```java

public interface Message {

    void send();

}

 

public interface Notification {

    void notifyUser();

}

```

 

##### 具体消息类和通知类

 

```java

public class EmailMessage implements Message {

    @Override

    public void send() {

        System.out.println("Sending email message.");

    }

}

 

public class SMSMessage implements Message {

    @Override

    public void send() {

        System.out.println("Sending SMS message.");

    }

}

 

public class EmailNotification implements Notification {

    @Override

    public void notifyUser() {

        System.out.println("Notifying user via email.");

    }

}

 

public class SMSNotification implements Notification {

    @Override

    public void notifyUser() {

        System.out.println("Notifying user via SMS.");

    }

}

```

 

##### 具体工厂类

 

```java

public class EmailServiceFactory implements MessageServiceFactory {

    @Override

    public Message createMessage() {

        return new EmailMessage();

    }

 

    @Override

    public Notification createNotification() {

        return new EmailNotification();

    }

}

 

public class SMSServiceFactory implements MessageServiceFactory {

    @Override

    public Message createMessage() {

        return new SMSMessage();

    }

 

    @Override

    public Notification createNotification() {

        return new SMSNotification();

    }

}

```

 

##### 客户端

 

```java

public class Client {

    public static void main(String[] args) {

        MessageServiceFactory emailFactory = new EmailServiceFactory();

        Message email = emailFactory.createMessage();

        Notification emailNotification = emailFactory.createNotification();

        email.send();

        emailNotification.notifyUser();

 

        MessageServiceFactory smsFactory = new SMSServiceFactory();

        Message sms = smsFactory.createMessage();

        Notification smsNotification = smsFactory.createNotification();

        sms.send();

        smsNotification.notifyUser();

    }

}

```

 

### 运行结果

 

```

Sending email message.

Notifying user via email.

Sending SMS message.

Notifying user via SMS.

```

 

### 总结

 

工厂模式通过将对象的创建逻辑封装在工厂类中,提高了代码的灵活性和可维护性。不同的工厂模式适用于不同的场景:

 

- **简单工厂模式**:适用于简单的对象创建场景,不需要复杂的继承关系。

- **工厂方法模式**:适用于需要根据不同条件创建不同对象的场景,通过子类来决定创建哪个对象。

- **抽象工厂模式**:适用于需要创建一系列相关或依赖对象的场景,通过一个工厂接口来创建多个对象。

 

通过使用工厂模式,可以更好地管理和扩展对象的创建过程,使代码更加模块化和易于维护。


http://www.kler.cn/a/427763.html

相关文章:

  • gitlab-cicd部署安装与具体操作
  • 在visio2021 中插入MathType公式
  • 【bug】pymysql.err.OperationalError: (1046, ‘No database selected‘)
  • React16搭建-GPT回答
  • 游戏引擎学习第36天
  • [Flutter]Json序列化json_serializable使用属性全介绍
  • 嵌入式蓝桥杯学习4 lcd移植
  • 【Linux】09 -- Linux下的shell编程(一)
  • 针对xpath局限的解决方案
  • 室联人形机器人:家政服务任务结构化、技术要点、深入应用FPGA的控制系统框架设计(整合版)
  • docker 安装mysql8.0.29
  • 【Leetcode Top 100 - 扩展】876. 链表的中间结点
  • OpeAI大模型学习(一)
  • WPF Prism ViewDiscovery
  • Python机器学习笔记(五、决策树集成)
  • 以攻击者的视角进行软件安全防护
  • Java爬虫技术:全面获取电商平台所有商品信息
  • C++ - map,set
  • 【Java Web】Tomcat 快速入门
  • Next.js 实战 (二):搭建 Layouts 基础排版布局