修改 Bank 类来实现单子设计模式:
实验目的单子模式。
提示-
修改 Bank 类,创建名为 getBank 的公有静态方法,它返回一个 Bank 类的实例。
-
单个的实例应是静态属性,且为私有。同样,Bank 构造器也应该是私有的。
创建 CustomerReport 类
- 在前面的银行项目练习中,“客户报告”嵌入在 TestBanking 应用程序的 main 方法中。在这个练习中,将该部分代码被改为放在banking.reports 包的 CustomerReport 类中。您的任务是修改这个类,使其使用单一银行对象。
- 查找标注为注释块的代码行.修改该行以检索单子银行对象。
编译并运行 TestBanking 应用程序 看到下列输入结果:
CUSTOMERS REPORT ================ Customer: Simms, Jane Savings Account: current balance is ¥500.0 Checking Account: current balance is ¥200.0 Customer: Bryant, Owen Checking Account: current balance is ¥200.0 Customer: Soley, Tim Savings Account: current balance is ¥1500.0 Checking Account: current balance is ¥200.0 Customer: Soley, Maria Checking Account: current balance is ¥200.0 Savings Account: current balance is ¥150.0代码 【Account.java】类
package banking;
public class Account {
protected double balance; //银行帐户的当前(或即时)余额
//公有构造器 ,这个参数为 balance 属性赋值
public Account(double init_balance) {
this.balance = init_balance;
}
//用于获取经常余额
public double getBalance() {
return balance;
}
public boolean deposit(double amt){
balance+=amt;
return true;
}
public boolean withdraw(double amt){
if (amt < balance){
balance-=amt;
return true;
}else{
return false;
}
}
}
【Customer.java】类
package banking;
public class Customer {
private String firstName;
private String lastName;
private Account[] accounts = new Account[10];
private int numOfAccounts;
public Customer(String f, String l) {
this.firstName = f;
this.lastName = l;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public Account getAccount(int index) {
return accounts[index];
}
public int getNumOfAccounts() {
return numOfAccounts;
}
public void addAccount(Account acct) {
accounts[numOfAccounts++]=acct;
}
}
【Bank.java】类
package banking;
public class Bank {
private Customer[] customers; //Customer对象的数组
private int numberOfCustomer; //整数,跟踪下一个 customers 数组索引
private static Bank bankInstance = null;
public static Bank getBank(){
if(bankInstance==null){
bankInstance = new Bank();
}
return bankInstance;
}
private Bank() {
customers = new Customer[10];
}
public void addCustomer(String f,String l){
customers[numberOfCustomer++]=new Customer(f,l);
}
public Customer getCustomer(int index) {
return customers[index];
}
public int getNumOfCustomers() {
return numberOfCustomer;
}
}
【CheckingAccount.java】类
package banking;
public class CheckingAccount extends Account{
private double overdraftProtection;
public CheckingAccount(double balance) {
super(balance);
}
public CheckingAccount(double balance, double protect) {
super(balance);
this.overdraftProtection = protect;
}
@Override
public boolean withdraw(double amt){
if (balance < amt){
if (amt-balance>overdraftProtection) {
return false;
}else {
overdraftProtection-=amt-balance;
balance=0;
return true;
}
}else {
balance-=amt;
return true;
}
}
}
【SavingsAccount.java】类
package banking;
public class SavingsAccount extends Account{
private double interestRate;
public SavingsAccount(double balance, double interest_Rate) {
super(balance);
this.interestRate = interest_Rate;
}
}
【CustomerReport.java】类
package banking.reports;
import banking.Account;
import banking.Bank;
import banking.Customer;
import banking.SavingsAccount;
public class CustomerReport {
public static void generalReport() {
Bank bank = Bank.getBank();
System.out.println("tttCUSTOMERS REPORT");
System.out.println("ttt================");
for (int cust_idx = 0; cust_idx < bank.getNumOfCustomers(); cust_idx++) {
Customer customer = bank.getCustomer(cust_idx);
System.out.println();
System.out.println("Customer: "
+ customer.getLastName() + ", "
+ customer.getFirstName());
for (int acct_idx = 0; acct_idx < customer.getNumOfAccounts(); acct_idx++) {
Account account = customer.getAccount(acct_idx);
String account_type = "";
// Determine the account type
if (account instanceof SavingsAccount) {
account_type = "Savings Account";
} else {
account_type = "Checking Account";
}
// Print the current balance of the account
System.out.println("t" + account_type + ": current balance is ¥" + account.getBalance());
}
}
}
}
【TestBanking.java】类
package banking;
import banking.reports.CustomerReport;
import java.text.NumberFormat;
public class TestBanking {
public static void main(String[] args) {
NumberFormat currency_format = NumberFormat.getCurrencyInstance();
Bank bank = Bank.getBank();
Customer customer;
// Create several customers and their accounts
bank.addCustomer("Jane", "Simms");
customer = bank.getCustomer(0);
customer.addAccount(new SavingsAccount(500.00, 0.05));
customer.addAccount(new CheckingAccount(200.00, 400.00));
bank.addCustomer("Owen", "Bryant");
customer = bank.getCustomer(1);
customer.addAccount(new CheckingAccount(200.00));
bank.addCustomer("Tim", "Soley");
customer = bank.getCustomer(2);
customer.addAccount(new SavingsAccount(1500.00, 0.05));
customer.addAccount(new CheckingAccount(200.00));
bank.addCustomer("Maria", "Soley");
customer = bank.getCustomer(3);
// Maria and Tim have a shared checking account
customer.addAccount(bank.getCustomer(2).getAccount(1));
customer.addAccount(new SavingsAccount(150.00, 0.05));
CustomerReport.generalReport();
}
}



