工厂模式 - 程序实现(java)
09年5月CSDN一网友提出如下问题:
设计一个用于管理银行客户的类BankCustomer:
仅描述客户的几个重要方面:
帐号、身份证号、姓名、联系方式、密码、账户余额。
所有的成员变量均用private访问控制,因此每一个成员变量就要有相应的存取器
(getter和setter,即获取和设置其值的相应的成员方法。需要setter还是getter,还是两者都要,视情况而定) 成员方法:
开户(开户时必须要有身份证号),系统自动生成帐号,帐号使用系统时间(格式:"yyyyMMddHHmmss"14位),初始密码为“666666”。
注意开户和构造方法之间的关系。
存钱、取钱、显示账户信息、修改密码(密码最短要六位)
怎样在main中使用这个类,自行安排,要表现出你设计的类的各个方面,并在main中用英语加以注释
根据此,使用工厂模式设计如下若干类:
------------factory部分---------------------------xiaobin-------------
Customer: 抽象类(factory祖先类)
BankCustomer:继承类(factory类)
〉〉〉〉〉〉〉〉〉〉扩展部分
ContactWay:联系方式(factory引用类)
IM :实时消息(ContactWay引用类)
------------product部分---------------------------xiaobin-------------
Bank: 接口(product接口)
Account: 实现类(concrete product类)
类图如下:(使用Enterprise Architect绘制)
使用EA生成的代码如下:
Customer.java
package bankCustomer; /**
* @author xiaobin
* @version 1.0
* @created 23-5-2009 15:19:06
*/
public abstract class Customer { private Bank bank;
private double myMoney;
public Bank m_Bank; public Customer(){ } public void finalize() throws Throwable { } public abstract Bank createAccount(); public void myAccount(){ } public void mySaveMoney(){ } public void myTakeMoney(){ }
}
BankCustomer.java
package bankCustomer; /**
* @author xiaobin
* @version 1.0
* @created 23-5-2009 15:30:13
*/
public class BankCustomer extends Customer { private ContactWay contact;
private String name;
private String personID;
public Account m_Account;
public ContactWay m_ContactWay; public BankCustomer(){ } public void finalize() throws Throwable {
super.finalize();
} public Bank createAccount(){
return null;
} private ContactWay getContact(){
return null;
} private String getName(){
return "";
} private String getPersonID(){
return "";
} /**
*
* @param contactWay
*/
private void setContact(ContactWay contactWay){ } /**
*
* @param myName
*/
private void setName(String myName){ } /**
*
* @param myPersonID
*/
private void setPersonID(String myPersonID){ }
}
ContactWay.java
package bankCustomer; /**
* @author xiaobin
* @version 1.0
* @created 23-5-2009 15:30:29
*/
class ContactWay { private String email;
private IM imContact;
private String mobilePhone;
private String phone;
public IM m_IM; public ContactWay(){ } public void finalize() throws Throwable { } private String getEmail(){
return "";
} private IM getImContact(){
return null;
} private String getMobilePhone(){
return "";
} private String getPhone(){
return "";
} /**
*
* @param myEmail
*/
private void setEmail(String myEmail){ } /**
*
* @param im
*/
private void setImContact(IM im){ } /**
*
* @param mobilePhone
*/
private void setMobilePhone(String mobilePhone){ } /**
*
* @param myPhone
*/
private void setPhone(String myPhone){ }
}
IM.java
package bankCustomer; /**
* @author xiaobin
* @version 1.0
* @created 23-5-2009 15:30:39
*/
class IM { private String MSN;
private String QQ; public IM(){ } public void finalize() throws Throwable { } private String getMSN(){
return "";
} private String getQQ(){
return "";
} /**
*
* @param msn
*/
private void setMSN(String msn){ } /**
*
* @param qq
*/
private void setQQ(String qq){ }
}
Bank.java
package bankCustomer; /**
* @author xiaobin
* @version 1.0
* @created 23-5-2009 15:19:16
*/
public interface Bank { /**
*
* @param money
*/
public boolean saveMoney(double money); /**
*
* @param money
*/
public boolean takeMoney(double money); }
Account.java
package bankCustomer; /**
* @author xiaobin
* @version 1.0
* @created 07-7-2013 20:21:35
*/
public class Account implements Bank { private String accountID;
private double accountSurplus;
private Date date; public Account(){ } public void finalize() throws Throwable { } /**
*
* @param val1
* @param val2
*/
private double addAlgorithm(double val1, double val2){
return 0;
} /**
*
* @param now
*/
private String createMyAccount(Date now){
return "";
} private String getAccountID(){
return "";
} /**
*
* @param oldPWD
* @param curPWD
*/
private boolean modifyPWD(String oldPWD, String curPWD){
return false;
} /**
*
* @param money
*/
public synchronized boolean saveMoney(double money){
return false;
} private void setAccountID(){ } /**
*
* @param val1
* @param val2
*/
private double subAlgorithm(double val1, double val2){
return 0;
} /**
*
* @param money
*/
public synchronized boolean takeMoney(double money){
return false;
} }
工厂模式 - 程序实现(java)的更多相关文章
- Java设计模式之-----工厂模式(简单工厂,抽象工厂)
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- java 深入浅出工厂模式
一.引子 话说十年前,有一个暴发户,他家有三辆汽车——Benz奔驰.Bmw宝马.Audi奥迪,还雇了司机为他开车.不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“ ...
- 学习:java设计模式—工厂模式
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Facto ...
- Java设计模式系列之工厂模式
工厂模式将大量有共同接口的类实例化,工厂模式可以实现动态决定实例化哪一个类的对象,工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factory):添加某一种类型的 ...
- java三种工厂模式
适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类.只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值.本节概括了这些场合. 7.3.1 动态实现 ...
- Java设计模式02:常用设计模式之工厂模式(创建型模式)
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Fact ...
- 工厂模式Java
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- java设计模式—工厂模式
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- Java设计模式——工厂模式
一.工厂模式分类 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: (1)简单工厂模式(Simp ...
随机推荐
- Android 6.0 Permission权限与安全机制
Marshmallow版本权限修改 android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次.一旦安装了,app可以在用户毫不知晓的情况下访问权限内的所有东西,而且一般用户安 ...
- yii2源码学习笔记(九)
Application是所有应用程序类的基类,接下来了解一下它的源码.yii2\base\Application.php. <?php /** * @link http://www.yiifra ...
- 10个必看的PHP小代码,很实用!
获取浏览器IP地址 function getRemoteIPAddress() { $ip = $_SERVER['REMOTE_ADDR']; return $ip; } 如果有代理服务器的情况下获 ...
- php 获取客户端IP地址
/** * 获取真实IP地址 */ /* 在PHP中getenv(参数)函数是一个用于获取环境变量的函数,根据提供不同的参数可以获取不同的环境变量, getenv("REMOTE_ADDR& ...
- matlab常用小函数(二)
numel 元素个数 assert 表达式为假时输出某个字符串 int2str 整形转化为字符串型 numel(A) 返回A中的元素个数,A可以是任何的数据结构,如向量.矩阵.元胞.结构体等 asse ...
- BZOJ 4008 亚瑟王
Description 小K不慎被LL邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游 ...
- bootcamp
为了鄙社自主研发的html5studio和mist,我给Air划了32G装windows囧 第一要注意的是,必须使用bootcamp划分将要安装windows的分区,不要在windows安装过程中删除 ...
- SQL server 触发器、视图
一.触发器 1.触发器为特殊类型的存储过程,可在执行语言事件时自动生效.SQL Server 包括三种常规类型的触发器:DML 触发器.DDL 触发器和登录触发器. 主要讲述DML触发器,DML触发器 ...
- 【HDOJ】2966 In case of failure
KD树,这东西其实在ML经常被使用,不过30s的时限还是第一次见. /* 2966 */ #include <iostream> #include <string> #incl ...
- LINUX系统中动态链接库的创建与使用{补充}
大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部 ...