设计一个银行系统,使用设计模式来实现以下功能:
1创建银行账户。
2给银行账户存款。
3从银行账户取款。
4查询银行账户余额。要求如下:
使用工厂模式(Factory)创建银行账户对象。
使用单例模式(Singleton)创建银行服务对象,提供存款、取款、查询余额等服务。
使用观察者模式((Observer)实现当账户余额发生变化时通知观察者,例如发送短信通知用户。
设计模式:
工厂模式(Factory):用于创建银行账户对象,可以通过传入账户ID和账户名等参数来创建银行账户对象。
单例模式(Singleton):用于创建银行服务对象,确保只有一个银行服务对象被创建,可以提供唯一的存款、取款、查询余额等服务。
观察者模式(Observer):当账户余额发生变化时,可以通知观察者对象,例如发送短信通知用户,以便它们可以执行相应的操作。
相关类/接口定义:
AccountFactory类:银行账户工厂类,用于创建银行账户对象。
BankService类:银行服务类,采用单例模式,包含存款、取款、查询余额等服务。
AccountObserver类:观察者类,用于观察账户余额变化并执行相应的操作,例如发送短信通知用户。
BankAccount类:银行账户类,包含账号、账户名称、余额等要素。
// 银行账户类
public class BankAccount {
private String id;
private String name;
private double balance;
private List<AccountObserver> observers = new ArrayList<>();
public BankAccount(String id, String name) {
this.id = id;
this.name = name;
}
public void deposit(double amount) {
balance += amount;
notifyObservers();
}
public void withdraw(double amount) {
if (balance >= amount) {
balance -= amount;
notifyObservers();
}else {
System.out.println("Insufficient balance");
}
}
public double getBalance() {
return balance;
}
public void addObserver(AccountObserver observer) {
observers.add(observer);
}
private void notifyObservers() {
for (AccountObserver observer : observers) {
observer.update(this);
}
}
}
// 观察者接口
public interface AccountObserver{
void update(BankAccount account);
}
// 具体观察者类
public class SMSNotifier implements AccountObserver {
@Override
public void update(BankAccount account) {
System.out.println("Sending SMS to user with new balance: " + account.getBalance());
}
}
// 银行服务类
public class BankService {
private static BankService instance;
private BankService() {}
public static BankService getInstance() {
if (instance == null) {
instance = new BankService();
}
return instance;
}
public BankAccount createAccount(String id, String name) {
return new BankAccount(id, name);
}
}
// 工厂类
public class AccountFactory {
public BankAccount createAccount(String id, String name) {
BankAccount account = BankService.getInstance().createAccount(id, name);
account.addObserver(new SMSNotifier());
return account;
}
}