实验题目
修改 Bank 类来实现单子设计模式:
实验目的
单子模式。
提示
- 修改 Bank 类,创建名为 getBank 的公有静态方法,它返回一个 Bank 类的实例。
- 单个的实例应是静态属性,且为私有。同样,Bank 构造器也应该是私有的。
创建 CustomerReport 类
- 在前面的银行项目练习中,“客户报告”嵌入在 TestBanking 应用程序的 main 方法中。在这个练习中,将该部分代码被改为放在banking.reports 包的 CustomerReport 类中。您的任务是修改这个类,使其使用单一银行对象。
- 查找标注为注释块/** * ***/的代码行.修改该行以检索单子银行对象。
编译并运行 TestBanking 应用程序 看到下列输入结果:
CUSTOMERSREPORT================Customer: Simms, JaneSavingsAccount: currentbalanceis¥500.0CheckingAccount: currentbalanceis¥200.0Customer: Bryant, OwenCheckingAccount: currentbalanceis¥200.0Customer: Soley, TimSavingsAccount: currentbalanceis¥1500.0CheckingAccount: currentbalanceis¥200.0Customer: Soley, MariaCheckingAccount: currentbalanceis¥200.0SavingsAccount: currentbalanceis¥150.0
代码
【Account.java】类
packagebanking; publicclassAccount { protecteddoublebalance; //银行帐户的当前(或即时)余额//公有构造器 ,这个参数为 balance 属性赋值publicAccount(doubleinit_balance) { this.balance=init_balance; } //用于获取经常余额publicdoublegetBalance() { returnbalance; } /*** 向当前余额增加金额* @param amt 增加金额* @return 返回 true(意味所有存款是成功的)*/publicbooleandeposit(doubleamt){ balance+=amt; returntrue; } /*** 从当前余额中减去金额* @param amt 提款数目* @return 如果 amt小于 balance, 则从余额中扣除提款数目并返回 true,否则余额不变返回 false。*/publicbooleanwithdraw(doubleamt){ if (amt<balance){ balance-=amt; returntrue; }else{ returnfalse; } } }
【Customer.java】类
packagebanking; publicclassCustomer { privateStringfirstName; privateStringlastName; privateAccount[] accounts=newAccount[10]; privateintnumOfAccounts; publicCustomer(Stringf, Stringl) { this.firstName=f; this.lastName=l; } publicStringgetFirstName() { returnfirstName; } publicStringgetLastName() { returnlastName; } /*** 通过下标索引获取 account* @param index 下标索引* @return account*/publicAccountgetAccount(intindex) { returnaccounts[index]; } /*** 获取 numOfAccounts* @return numOfAccounts*/publicintgetNumOfAccounts() { returnnumOfAccounts; } /*** 添加 account,并将 numOfAccounts+1* @param acct account*/publicvoidaddAccount(Accountacct) { accounts[numOfAccounts++]=acct; } }
【Bank.java】类
packagebanking; /*** 银行类*/publicclassBank { privateCustomer[] customers; //Customer对象的数组privateintnumberOfCustomer; //整数,跟踪下一个 customers 数组索引privatestaticBankbankInstance=null; /*** getBanking 的公有静态方法,它返回一个 Bank 类的实例。* @return 返回一个 Bank 类的实例。*/publicstaticBankgetBank(){ if(bankInstance==null){ bankInstance=newBank(); } returnbankInstance; } /*** 单例模式中构造器也应该是私有的,以合适的最大尺寸(至少大于 5)初始化 customers 数组。*/privateBank() { customers=newCustomer[10]; } /*** 该方法必须依照参数(姓,名)构造一个新的 Customer 对象然后把它放到 customer 数组中。还必须把 numberOfCustomers 属性的值加 1。* @param f 姓* @param l 名*/publicvoidaddCustomer(Stringf,Stringl){ customers[numberOfCustomer++]=newCustomer(f,l); } /*** 通过下标索引获取 customer* @param index 下标索引* @return customer*/publicCustomergetCustomer(intindex) { returncustomers[index]; } publicintgetNumOfCustomers() { returnnumberOfCustomer; } }
【CheckingAccount.java】类
packagebanking; publicclassCheckingAccountextendsAccount{ privatedoubleoverdraftProtection; publicCheckingAccount(doublebalance) { super(balance); } publicCheckingAccount(doublebalance, doubleprotect) { super(balance); this.overdraftProtection=protect; } /*** 此方法必须执行下列检查。如 果当前余额足够弥补取款 amount,则正常进行。* 如果不够弥补但是存在透支保护,则尝试用 overdraftProtection 得值来弥补该差值(balance-amount).* 如果弥补该透支所需要的金额大于当前的保护级别。则整个交易失败,但余额未受影响。* @param amt 提款数目* @return 返回true代表交易成功,否则交易失败*/publicbooleanwithdraw(doubleamt){ if (balance<amt){ if (amt-balance>overdraftProtection) { returnfalse; }else { overdraftProtection-=amt-balance; balance=0; returntrue; } }else { balance-=amt; returntrue; } } }
【SavingsAccount.java】类
packagebanking; publicclassSavingsAccountextendsAccount{ privatedoubleinterestRate; publicSavingsAccount(doublebalance, doubleinterest_Rate) { super(balance); this.interestRate=interest_Rate; } }
【CustomerReport.java】类
packagebanking.reports; importbanking.Account; importbanking.Bank; importbanking.Customer; importbanking.SavingsAccount; publicclassCustomerReport { /*** 生成客户报告,Generate a report*/publicstaticvoidgeneralReport() { Bankbank=Bank.getBank(); System.out.println("\t\t\tCUSTOMERS REPORT"); System.out.println("\t\t\t================"); for (intcust_idx=0; cust_idx<bank.getNumOfCustomers(); cust_idx++) { Customercustomer=bank.getCustomer(cust_idx); System.out.println(); System.out.println("Customer: "+customer.getLastName() +", "+customer.getFirstName()); for (intacct_idx=0; acct_idx<customer.getNumOfAccounts(); acct_idx++) { Accountaccount=customer.getAccount(acct_idx); Stringaccount_type=""; // Determine the account type/*** Step 1:**** Use the instanceof operator to test what type of account**** we have and set account_type to an appropriate value, such**** as "Savings Account" or "Checking Account".***/if (accountinstanceofSavingsAccount) { account_type="Savings Account"; } else { account_type="Checking Account"; } // Print the current balance of the account/*** Step 2:**** Print out the type of account and the balance.**** Feel free to use the currency_format formatter**** to generate a "currency string" for the balance.***/System.out.println("\t"+account_type+": current balance is ¥"+account.getBalance()); } } } }
【TestBanking.java】类
packagebanking;/** This class creates the program to test the banking classes.* It creates a set of customers, with a few accounts each,* and generates a report of current account balances.*/importbanking.reports.CustomerReport; importjava.text.NumberFormat; publicclassTestBanking { publicstaticvoidmain(String[] args) { NumberFormatcurrency_format=NumberFormat.getCurrencyInstance(); Bankbank=Bank.getBank(); Customercustomer; // Create several customers and their accountsbank.addCustomer("Jane", "Simms"); customer=bank.getCustomer(0); customer.addAccount(newSavingsAccount(500.00, 0.05)); customer.addAccount(newCheckingAccount(200.00, 400.00)); bank.addCustomer("Owen", "Bryant"); customer=bank.getCustomer(1); customer.addAccount(newCheckingAccount(200.00)); bank.addCustomer("Tim", "Soley"); customer=bank.getCustomer(2); customer.addAccount(newSavingsAccount(1500.00, 0.05)); customer.addAccount(newCheckingAccount(200.00)); bank.addCustomer("Maria", "Soley"); customer=bank.getCustomer(3); // Maria and Tim have a shared checking accountcustomer.addAccount(bank.getCustomer(2).getAccount(1)); customer.addAccount(newSavingsAccount(150.00, 0.05)); CustomerReport.generalReport(); } }