前言:
先遇到问题再找解决问题的方法!在开始介绍简单工厂模式,先通过一个场景来引出简单工厂模式出现的目的;
在Java开发中,我们经常与数据库打交道,但是,由于生产数据库的厂商有很多,因此可供开发使用的数据库也就有很多,但是无论选择哪种数据库,这些数据库都会支持一些公共的数据操作,比如插入、删除、查询以及修改等操作,不过对于不同的数据库来说,这些操作的代码编写遵循的规范也不相同,因此,如果使用数据库MySQL开发的应用,由于客户需求的变化,要求改用数据库Oracle来实现,那么,原来开发好的应用中将会有很多地方需要改动,这给开发人员带来了很多繁琐的工作,而且大量的修改代码,也违背了开发中应该遵守的“开放-封闭原则“,即对扩展开发,对修改关闭!
这个时候,简单工厂模式就可以施展拳脚啦!
简单工厂模式
将不同数据库支持的操作封装为一个接口,取名为Operation_DB;接着,对应于不同的数据库,利用接口Operation_DB进行各自的实现类的设计,分别为Operation_DB_MySQL类和Operation_DB_Oracle类,并设计一个工厂类用于创建不同数据库的数据操作对象,取名为Operation_DB_Factory类;注意:以下的类中的方法并不是实际的数据库操作代码,为了方便理解,省略具体实现代码!
接口Operation_DB的具体实现:
package com.pattern.factory;
public interface Operation_DB {
//插入一条记录
public boolean insertItem();
//删除一条记录
public boolean deleteItem();
//修改一条记录
public boolean updateItem();
//查询一条记录
public boolean queryItem();
}
Operation_DB_MySQL类的具体实现:
package com.pattern.factory;
public class Operation_DB_MySQL implements Operation_DB {
@Override
public boolean insertItem() {
System.out.println("MySQL数据库的插入记录");
return false;
}
@Override
public boolean deleteItem() {
System.out.println("MySQL数据库的删除记录");
return false;
}
@Override
public boolean updateItem() {
System.out.println("MySQL数据库的修改记录");
return false;
}
@Override
public boolean queryItem() {
System.out.println("MySQL数据库的查询记录");
return false;
}
}
Operation_DB_Oracle类的具体实现:
package com.pattern.factory;
public class Operation_DB_Oracle implements Operation_DB {
@Override
public boolean insertItem() {
System.out.println("Oracle数据库的插入记录");
return false;
}
@Override
public boolean deleteItem() {
System.out.println("Oracle数据库的删除记录");
return false;
}
@Override
public boolean updateItem() {
System.out.println("Oracle数据库的修改记录");
return false;
}
@Override
public boolean queryItem() {
System.out.println("Oracle数据库的查询记录");
return false;
}
}
工厂类Operation_DB_Factory的具体实现:
package com.pattern.factory;
public class Operation_DB_Factory {
public static Operation_DB getOperation_DB_(String DB_NAME) {
Operation_DB operation_DB = null;
switch(DB_NAME){
case "MySQL": operation_DB = new Operation_DB_MySQL();break;
case "Oracle": operation_DB = new Operation_DB_Oracle();break;
}
return operation_DB;
}
}
测试类:
package com.pattern.factory;
public class Test {
public static void main(String[] args) {
Operation_DB operation_DB = Operation_DB_Factory.getOperation_DB_("MySQL");//A
operation_DB.queryItem();
operation_DB.deleteItem();
operation_DB.insertItem();
operation_DB.updateItem()
}
}
使用简单工厂模式进行数据库操作的设计,就只需要在更换数据库的时候,通过针对需要使用的数据库设计对应的实现了接口Operation_DB 的数据操作类,工厂类获取对应的数据操作对象operation_DB ,将A处的对象替换为现在的操作对象即可;其余的都可以不用修改!
工厂模式
针对上述的应用场景,还可以设计出对应的工厂模式,工厂模式与简单工厂模式的区别就在于,工厂模式将简单工厂模式中应对变化的需求产生对应的数据操作对象的工作转移到了每个数据库对应的工厂类中;因此,我们保留原有的接口Operation_DB、Operation_DB_MySQL类 和Operation_DB_Oracle类,再添加一个工厂接口Operation_DB_Factory_Interface和两个实现了该接口的具体工厂类Operation_Oracle_DB_Factory和Operation_MySQL_DB_Factory;
Operation_DB_Factory_Interface接口的具体实现:
package com.pattern.factory;
public interface Operation_DB_Factory_Interface {
public Operation_DB getOperation_DB();
}
Operation_MySQL_DB_Factory类的具体实现:
package com.pattern.factory;
public class Operation_MySQL_DB_Factory implements Operation_DB_Factory_Interface {
@Override
public Operation_DB getOperation_DB() {
return new Operation_DB_MySQL();
}
}
Operation_Oracle_DB_Factory类的具体实现:
package com.pattern.factory;
public class Operation_Oracle_DB_Factory implements Operation_DB_Factory_Interface{
@Override
public Operation_DB getOperation_DB() {
return new Operation_DB_Oracle();
}
}
对应的主类为:
package com.pattern.factory;
public class Test {
public static void main(String[] args) {
Operation_DB_Factory_Interface operation_DB_Factory = new Operation_MySQL_DB_Factory();//A
Operation_DB operation_DB = operation_DB_Factory .getOperation_DB()
operation_DB.queryItem();
operation_DB.deleteItem();
operation_DB.insertItem();
operation_DB.updateItem()
}
}