例:设计一个程序实现不同数据库对不同数据表的操作
抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类
将不同数据库分开,每一个数据库都对应一个操作工厂,实现该数据库对数据的操作
如果实现对不同数据库表,使用不同数据库对其进行操作时,只需增加对应表的抽象工厂即可;这里实现了对用户表的操作,当然也需要增加处理对应表的类
这里只实现了,对user表的不同数据库操作未对实现部门表的操作
方法:抽象工厂模式
工厂代码:
interface ifactory//定义一个访问不同表的抽象工厂接口
{
Iuser createuser();//use表对应操作类的创建
//可增加其他表对应类的创建,需要设计其对应的类及其操作类;
}
class sqlserverfactory implements ifactory{
@Override
public Iuser createuser() {
// TODO Auto-generated method stub
return new sqlserveruser();
}
}
class accessfactory implements ifactory{
@Override
public Iuser createuser() {
// TODO Auto-generated method stub
return new accessuser();
}
}
源代码:
package org.yunan.design;
import java.util.Scanner;
public class abstractfactory {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
user user =new user();
ifactory access=new accessfactory();//通过access访问数据库;
Iuser iu=access.createuser();
iu.insert(new user());//用access插入一条数据
iu.getuser(1);//用access访问一条数据;
ifactory sqlserver=new sqlserverfactory();//通过access访问数据库;
Iuser Iu=sqlserver.createuser();
Iu.insert(new user());//用sqlserve插入一条数据
Iu.getuser(1);//用sqlserve访问一条数据;
}
}
class user{//use表的类
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
interface Iuser//use表的操作类
{
void insert(user use);
user getuser(int id);
}
class sqlserveruser implements Iuser{//SQL server实现对书记库表的操作
@Override
public void insert(user use) {
// TODO Auto-generated method stub
System.out.println("在sqlserver中给用户加一条数据");
}
@Override
public user getuser(int id) {
// TODO Auto-generated method stub
System.out.println("在sqlserver中通过ID得到用户一条数据ID="+id);
return null;
}
}
class accessuser implements Iuser{//access实现对数据库表的操作
@Override
public void insert(user use) {
// TODO Auto-generated method stub
System.out.println("在access中给用户加一条数据");
}
@Override
public user getuser(int id) {
// TODO Auto-generated method stub
System.out.println("在access中通过ID得到用户一条数据ID="+id);
return null;
}
}
interface ifactory//定义一个访问不同表的抽象工厂接口
{
Iuser createuser();//use表对应操作类的创建
//可增加其他表对应类的创建,需要设计其对应的类及其操作类;
}
class sqlserverfactory implements ifactory{
@Override
public Iuser createuser() {
// TODO Auto-generated method stub
return new sqlserveruser();
}
}
class accessfactory implements ifactory{
@Override
public Iuser createuser() {
// TODO Auto-generated method stub
return new accessuser();
}
}
适用场景:
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代 码
提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现
优点:
具体产品在应用层的代码隔离,无需关心创建的细节
将一个系列的产品统一到一起创建
缺点:
规定了所有可能被创建的产品集合,产品簇中扩展新的产品困难;
增加了系统的抽象性和理解难度
以上部分摘取自朱红梅老师2020年5月的课件。