基於上一個實驗Banking_5 ,代碼先全部復制過來.
筆記心得:
1.SavingAccount() 需要兩種構造方法,接受單個參數和兩個的 2.Account 有兩個類型 SavingAccount 和 CheckingAccount ,每個人都有兩個或一個 ,
setAccount(Account account,int id) ,id=1 表示設置前者, id=2表示設置后者. 3.在 public class CustomerReport{}中 ,首先調用static Bank : Bank bank=Bank.getBank();
然后遍歷其中元素, 可能存在只有一個賬戶,所以需要特判一下:
if(customer.getSavingAccount()!=null) 和if(customer.getCheckingAccount()!=null) ,解決這個空內存 的異常!
實驗要求:
實驗目的: 單例模式。 提示: 1. 修改 Bank 類,創建名為 getBanking 的公有靜態方法,它返回一個 Bank 類的實例。 2. 單個的實例應是靜態屬性,且為私有。同樣,Bank 構造器也應該是私有的 創建 CustomerReport 類 1.在前面的銀行項目練習中,“客戶報告”嵌入在 TestBanking 應用程序的 main 方法中。在這個練習中,改代碼被放在,banking.reports 包的 CustomerReport 類中。您的任務是修改這個類,使其使用單一銀行對象。 2. 查找標注為注釋塊/*** ***/的代碼行.修改該行以檢索單子銀行對象。
文件工程組織: (基於上一個實驗Banking_5 ,代碼 先 全部復制過來,然后再具體改改.)
具體代碼:
Bank.java (構造器方法私有化,private static Bank bank=new Bank();)

package Banking_6; //要求使bank實現單例模式 public class Bank { private Customer[] customers ; //用於存放客戶 private int numberofCustomers; //用於記錄Customer的個數 private Bank(){ ///構造器方法私有化 numberofCustomers=0; customers = new Customer[100]; ///這里記得要初始化!不然要發生java.lang.NullPointerException } private static Bank bank=new Bank(); public static Bank getBank(){ return bank; } public void addCustomer(String f,String l){ int i= this.numberofCustomers; customers[i]=new Customer(f,l);//新建一個構造對象 this.numberofCustomers++; } public int getNumOfCustomers() { return numberofCustomers; } public Customer getCustomer(int index) { return customers[index]; } }
CustomerReport.java (打印全部Bank的信息 )

package Banking_6; //遍歷銀行里的所有賬戶,進行匯報 public class CustomerReport { Bank bank=Bank.getBank(); public void generateReport(){ System.out.println("======================================="); System.out.println(" "+"CUSTOMERS REPORT"); System.out.println("======================================="); int num=bank.getNumOfCustomers(); Customer customer; Account Savingaccount,Checkingaccount; for(int i=0;i<num;i++){ customer=bank.getCustomer(i); Savingaccount = customer.getSavingAccount(); Checkingaccount=customer.getCheckingAccount(); //輸出所有存款信息 System.out.println("Customer: "+customer.getFirstName()+" "+customer.getLastName()); if(customer.getSavingAccount()!=null) System.out.println("SavingAccount: current balance is $"+customer.getSavingAccount().getBalance()); if(customer.getCheckingAccount()!=null) System.out.println("CheckingAccount: current balance is $"+customer.getCheckingAccount().getBalance()); System.out.println(); } } }
TestBank.java

package TestBanks; import Banking_6.*; public class TestBanking_6 { public static void main(String[] args) { Bank bank = Bank.getBank(); Customer customer; CustomerReport report = new CustomerReport(); // Create several customers and their accounts bank.addCustomer("Jane", "Simms"); customer = bank.getCustomer(0); customer.setAccount(new SavingAccount(500.00, 0.05),1); customer.setAccount(new CheckingAccount(200.00, 400.00),2); bank.addCustomer("Owen", "Bryant"); customer = bank.getCustomer(1); customer.setAccount(new CheckingAccount(200.00),2); bank.addCustomer("Tim", "Soley"); customer = bank.getCustomer(2); customer.setAccount(new SavingAccount(1500.00, 0.05),1); customer.setAccount(new CheckingAccount(200.00),2); bank.addCustomer("Maria", "Soley"); customer = bank.getCustomer(3); // Maria and Tim have a shared checking account customer.setAccount(bank.getCustomer(2).getCheckingAccount(),1); customer.setAccount(new SavingAccount(150.00, 0.05),2); // Generate a report report.generateReport(); } }
Account.java

package Banking_6; public class Account { protected double balance=0;//余額 ,uml前該變量是 '-' public Account(double init_balance){ balance=init_balance; } public double getBalance() { return balance; } public void setBalance(double b){this.balance=b;} //存錢 public boolean deposit(double amt){ this.balance+=amt;return true; } //取錢 public Boolean withdraw(double amt) { if(amt>this.balance) return false; else{ this.balance-=amt; return true; } } }
TestBanking_6.java (測試類)

1 package TestBanks; 2 import Banking_6.*; 3 public class TestBanking_6 { 4 5 public static void main(String[] args) { 6 Bank bank = Bank.getBank(); 7 Customer customer; 8 CustomerReport report = new CustomerReport(); 9 10 // Create several customers and their accounts 11 bank.addCustomer("Jane", "Simms"); 12 customer = bank.getCustomer(0); 13 customer.setAccount(new SavingAccount(500.00, 0.05),1); 14 customer.setAccount(new CheckingAccount(200.00, 400.00),2); 15 16 bank.addCustomer("Owen", "Bryant"); 17 customer = bank.getCustomer(1); 18 customer.setAccount(new CheckingAccount(200.00),2); 19 20 bank.addCustomer("Tim", "Soley"); 21 customer = bank.getCustomer(2); 22 customer.setAccount(new SavingAccount(1500.00, 0.05),1); 23 customer.setAccount(new CheckingAccount(200.00),2); 24 25 bank.addCustomer("Maria", "Soley"); 26 customer = bank.getCustomer(3); 27 // Maria and Tim have a shared checking account 28 customer.setAccount(bank.getCustomer(2).getCheckingAccount(),1); 29 customer.setAccount(new SavingAccount(150.00, 0.05),2); 30 31 // Generate a report 32 report.generateReport(); 33 } 34 }
輸出結果:

======================================= CUSTOMERS REPORT ======================================= Customer: Jane Simms SavingAccount: current balance is $500.0 CheckingAccount: current balance is $200.0 Customer: Owen Bryant CheckingAccount: current balance is $200.0 Customer: Tim Soley SavingAccount: current balance is $1500.0 CheckingAccount: current balance is $200.0 Customer: Maria Soley SavingAccount: current balance is $200.0 CheckingAccount: current balance is $150.0