<十一>读<<大话设计模式>>之抽象工厂模式
2016-04-06 19:57
351 查看
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们详细的类。
<<大话设计模式>>以项目上线时想换另外一个数据库为样例展开的,假如我没原来用的是SqlServer,如今换成access,代码例如以下:
1、訪问数据库工厂
/**
* @author jzhf
* 2014-11-03
* 创建一个訪问user的工厂接口
*/
public
interface IFactory {
IUser createUser();
IDepartment createDepartment();
}
IUser指的是对用户表的操作,IDepartment指的是对部门表的操作,关于这两个类在以下有介绍。
2、SqlServer数据库工厂类操作
public
class SqlServerFactory implements IFactory {
/* (non-Javadoc)
* @seecom.test.model.abstractFactory.IFactory#createUser()
*/
public IUser createUser() {
// TODO Auto-generatedmethod stub
return
new SqlServerUser();
}
/* (non-Javadoc)
* @seecom.test.model.abstractFactory.IFactory#createDepartment()
*/
public IDepartment createDepartment() {
// TODO Auto-generatedmethod stub
return
new SqlServerDepartment();
}
}
3、详细类,对user操作
/**
* @author jzhf
* 2014-10-31
*/
public
class SqlServerUser implements IUser {
/* (non-Javadoc)
* @seecom.test.model.abstractFactory.IUser#getUser(int)
*/
public
void getUser(int id) {
// TODO Auto-generatedmethod stub
System.out.println("sqlserverget User by Id");
}
/* (non-Javadoc)
* @seecom.test.model.abstractFactory.IUser#insert(com.test.model.abstractFactory.User)
*/
public
void insert(User user) {
// TODO Auto-generatedmethod stub
System.out.println("sqlserverinsert user");
}
}
4、用户接口
public
interface IUser {
void insert(User user);
void getUser(int id);
}
5、部门类与用户代码差点儿相同。略。access数据库代码与SqlServer数据库代码一致,略
6、client
public
class UserClient {
/**
* @param args
*/
public
static void main(String[] args) {
// TODO Auto-generatedmethod stub
IFactory factory = new SqlServerFactory();
IUser iUser = factory.createUser();
User user = new User();
user.setId(0);
user.setName("小王");
iUser.insert(user);
iUser.getUser(0);
IFactory factory2 = new AccessFactory();
IUser iUser2 = factory2.createUser();
iUser2.insert(user);
iUser2.getUser(0);
//-----------添加部门接口之后-----------
IDepartment iDepartment = factory.createDepartment();
//然后改动insert传入的值
}
}
从代码和以下的图标能够看到,IFactory是抽象工厂接口。它里面包括全部的产品创建的抽象方法,而SqlServerFactory和accessFactory就是详细的工厂,这个详细的工厂然后创建具有特定实现的产品对象。也就是说,为创建不同的产品对象。client应使用不同的详细工厂。
抽象工厂优缺点
长处:易于交换产品系列,因为详细工厂类,在一个应用中仅仅须要在初始化的时候出现一次,这就使得改变一个应用的详细工厂变得很easy,它仅仅须要改变详细工厂就可以使用不同的产品配置。第二个长处是它让详细的创建实例过程与client分离,client是通过它们的抽象接口操纵实例。产品的详细类名也被详细工厂的实现分离,不会出如今client代码中。
遵循了开放-封闭原则和依赖倒转原则。
缺点也是有的假设我要添加功能,则须要增家三个类。抽象工厂类。工厂详细类和详细实现类。还须要更改原抽象工厂才干够全然实现,很麻烦。
最后附上结构图:
相关文章推荐
- Xamarin.iOS + MvvmCross: UIPickerView data binding, SelectedItemChanged event
- 第六周上机实践项目——项目4-静态成员的应用
- js 拖拽(一)
- Caffe学习系列(22):caffe图形化操作工具digits运行实例
- win7下安装theano和cuda
- Create Thread
- 日历插件My97DatePicker的使用
- 团队成员及题目
- c++覆盖 重载 隐藏 的关系
- word公式常用字体
- POJ 2524-Ubiquitous Religions(入门并查集)
- Android Touch事件传递机制
- 1 | Objective-C入门
- Caffe学习系列(21):caffe图形化操作工具digits的安装与运行
- Python public private
- PAT BASIC 1003
- poj 2646 The Trip
- 第四章:语句
- 读书笔记(chapter4)
- Android Studio系列教程四--Gradle基础