---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
引入:做好了一个管理系统,用的是sqlserver数据库,但另一个客户想要做同样的管理系统,数据库想用Access数据库。
首先我们想到用工厂模式来解决这个问题(假设现在数据库中只有一张表,用户user表)
首先我们先到要建立的类有: User类,SqlserverUser类,AccessUser类及他俩的父类IUser类,SqlserverUserFactory类,AccessUserFactory类,及他俩的父类IUserFactory类
具体实现:
User类
package DBDemo;
public class User {
private String name;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return id;
}
public void setAge(int age) {
this.id = age;
}
public User(String name, int age) {
super();
this.name = name;
this.id = age;
}
public User() {
}
}
IUser 类
package DBDemo;
public interface IUser {
public User selectUser(int id);
public void add(User user);
}
sqlserverUser 类
package DBDemo;
public class SqlserverUser implements IUser {
@Override
public User selectUser(int id) {
// TODO Auto-generated method stub
System.out.println("sqlserver此处写根据id查询用户表的具体实现");
return null;
}
@Override
public void add(User user) {
// TODO Auto-generated method stub
System.out.println("sqlserver此处写向用户表增加用户的具体实现");
}
}
AccessUser 类
package DBDemo;
public class AccessUser implements IUser {
@Override
public User selectUser(int id) {
// TODO Auto-generated method stub
System.out.println("Access此处写根据id查询用户表的具体实现");
return null;
}
@Override
public void add(User user) {
// TODO Auto-generated method stub
System.out.println("Access此处写向用户表增加用户的具体实现");
}
}
IUserFactory 类
package DBDemo;
public interface IUserFactory {
IUser createSpecficUser();
}
SqlserverUserFactory 类
package DBDemo;
public class SqlserverUserFactory implements IUserFactory {
@Override
public IUser createSpecficUser() {
// TODO Auto-generated method stub
return new SqlserverUser();
}
}
AccessUserFactory 类
package DBDemo;
public class AccessUserFactory implements IUserFactory {
@Override
public IUser createSpecficUser() {
// TODO Auto-generated method stub
return new AccessUser();
}
}
Client 类
package DBDemo;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
User user = new User("zhangsan", 20);
IUserFactory iuserfactory = new SqlserverUserFactory();
IUser iuser = iuserfactory.createSpecficUser();
iuser.add(user);
iuser.selectUser(20);
}
}
但是现在由于业务需要,需要往数据库中添加另外一张表Department表,具体该如何实现呢?就还得增加7个类(与上面类似)Department类,SqlserverDepartment类,AccessDepartment类及他俩的父类IDepartment类,SqlserverDepartmentFactory类,
AccessDepartmentFactory类,及他俩的父类IDepartmentFactory类。
这种方式来设计代码:优点
1、客户端与服务端代码解耦,改动小
2、如增加功能,只需要增加新的类即可,符合基本的封闭-开放原则
缺点:
1、仍然需要客户端来决定实例化哪个类
2、如再增加一个部门Department类的话,增加的代码太多
注意区别前面计算器中的代码,计算器中不管是加减乘除,还是开方,乘方都是一个产品系列,而此处User表和Department表是两个不同的产品系列。所以此处用工厂模式不方便。
改进:抽象工厂模式
代码设计: 根据我们的印象,不同的产品系列要创建不同的工厂(工厂模式),这就是工厂模式与抽象工厂模式的区别。
IUser类,SqlserverUser类,AccessUSer类,USer类跟上面相同,
新增加部门类
Department类,IDepartment类,sqlserverDepartment类,AccessserverDepartment类
修改如下类
IFactory类,SqlserverFactory类,AccessFactory类
Department类
package DBDemo1;
public class Department {
public String name;
public String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Department(String name, String id) {
super();
this.name = name;
this.id = id;
}
public Department() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
IDepartment 类
package DBDemo1;
public interface IDpartmet {
void add(Department dep);
Department selectDepartment(String id);
}
SqlserverDepartment 类
package DBDemo1;
public class SqlserverDepartment implements IDpartmet {
@Override
public void add(Department dep) {
// TODO Auto-generated method stub
System.out.println("sqlserver中增加部门");
}
@Override
public Department selectDepartment(String id) {
// TODO Auto-generated method stub
System.out.println("sqlserver中查询部门");
return null;
}
}
AccessDepartment 类
package DBDemo1;
public class AccessDepartment implements IDpartmet {
@Override
public void add(Department dep) {
// TODO Auto-generated method stub
System.out.println("access中增加部门");
}
@Override
public Department selectDepartment(String id) {
// TODO Auto-generated method stub
System.out.println("access中查询部门");
return null;
}
}
IFactory 类
package DBDemo1;
public interface IFactory {
IUser createUSer();
IDpartmet createDepartment();
}
SqlserverFactory 类
package DBDemo1;
public class SqlserverFactory implements IFactory {
@Override
public IUser createUSer() {
// TODO Auto-generated method stub
System.out.println("创建sqlserveruser");
return null;
}
@Override
public IDpartmet createDepartment() {
// TODO Auto-generated method stub
System.out.println("创建sqlserver Department");
return null;
}
}
AccessFactory 类
package DBDemo1;
public class AccessFactory implements IFactory {
@Override
public IUser createUSer() {
// TODO Auto-generated method stub
System.out.println("创建access user");
return null;
}
@Override
public IDpartmet createDepartment() {
// TODO Auto-generated method stub
System.out.println("创建access Department");
return null;
}
}
Client 类
package DBDemo1;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
User user = new User("zhangsan", 10);
Department de = new Department("20", "huaman");
IFactory ifctory = new SqlserverFactory();
IUser iuser = ifctory.createUSer();
IDpartmet idp = ifctory.createDepartment();
}
}
应用场景举例:
1、游戏开发中的多风格系列场景
2、系统更改皮肤
3、支持多种观感标准的用户界面工具箱
4、多数据库支持
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------