用java写一个包含三种设计模式的程序其中必须有工厂方法模式,并使用MVC体系结构,写出测试类,说明每种模式使用方法
时间: 2024-02-13 12:04:24 浏览: 106
以下是一个使用Java编写的包含三种设计模式的程序,其中包括工厂方法模式,并使用MVC体系结构:
1. 工厂方法模式
工厂方法模式是一种创建型设计模式,它定义了一个接口,用于创建对象,但允许子类决定要实例化的类。在这个例子中,我们创建了一个抽象的Logger接口,并定义了一个LoggerFactory接口,用于创建Logger对象。然后我们创建了两个具体的Logger类(FileLogger和DatabaseLogger),并实现了LoggerFactory接口,用于创建相应的Logger对象。
```java
public interface Logger {
void log(String message);
}
public class FileLogger implements Logger {
public void log(String message) {
System.out.println("Logging to file: " + message);
}
}
public class DatabaseLogger implements Logger {
public void log(String message) {
System.out.println("Logging to database: " + message);
}
}
public interface LoggerFactory {
Logger createLogger();
}
public class FileLoggerFactory implements LoggerFactory {
public Logger createLogger() {
return new FileLogger();
}
}
public class DatabaseLoggerFactory implements LoggerFactory {
public Logger createLogger() {
return new DatabaseLogger();
}
}
```
2. 观察者模式
观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它会自动通知所有的观察者对象。在这个例子中,我们创建了一个抽象的Subject接口,并定义了一个Observer接口,用于监听Subject对象的变化。然后我们创建了两个具体的Observer类(EmailObserver和SMSObserver),并实现了Observer接口,用于监听相应的Subject对象。
```java
public interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObservers(String message);
}
public class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
public interface Observer {
void update(String message);
}
public class EmailObserver implements Observer {
public void update(String message) {
System.out.println("Sending email notification: " + message);
}
}
public class SMSObserver implements Observer {
public void update(String message) {
System.out.println("Sending SMS notification: " + message);
}
}
```
3. 单例模式
单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在这个例子中,我们创建了一个Singleton类,并将其构造函数设置为私有,以确保只有一个实例。然后我们使用一个静态变量来保存该实例,并提供一个静态方法来获取该实例。
```java
public class Singleton {
private static Singleton instance;
private Singleton() {
// private constructor
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
4. MVC体系结构
MVC是一种软件架构模式,它将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller)。在这个例子中,我们创建了一个模型类(Model),一个视图类(View)和一个控制器类(Controller),并使用它们来实现MVC体系结构。
```java
public class Model {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
public class View {
public void printMessage(String message) {
System.out.println(message);
}
}
public class Controller {
private Model model;
private View view;
public Controller(Model model, View view) {
this.model = model;
this.view = view;
}
public void setMessage(String message) {
model.setMessage(message);
}
public void printMessage() {
view.printMessage(model.getMessage());
}
}
```
5. 测试类
下面是一个测试类,它演示了如何使用上述三种设计模式,并将它们组合成MVC体系结构。
```java
public class Test {
public static void main(String[] args) {
// 工厂方法模式
LoggerFactory factory1 = new FileLoggerFactory();
Logger logger1 = factory1.createLogger();
logger1.log("Hello, world!");
LoggerFactory factory2 = new DatabaseLoggerFactory();
Logger logger2 = factory2.createLogger();
logger2.log("Hello, world!");
// 观察者模式
Subject subject = new ConcreteSubject();
Observer observer1 = new EmailObserver();
Observer observer2 = new SMSObserver();
subject.attach(observer1);
subject.attach(observer2);
subject.notifyObservers("Hello, world!");
// 单例模式
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2);
// MVC体系结构
Model model = new Model();
View view = new View();
Controller controller = new Controller(model, view);
controller.setMessage("Hello, world!");
controller.printMessage();
}
}
```
这个测试类演示了如何使用工厂方法模式创建Logger对象,使用观察者模式监听Subject对象的变化,使用单例模式保证只有一个Singleton实例,以及如何使用MVC体系结构将模型、视图和控制器分离开来。
阅读全文