设计模式 —— 抽象工厂模式

例:设计一个程序实现不同数据库对不同数据表的操作
抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类
将不同数据库分开,每一个数据库都对应一个操作工厂,实现该数据库对数据的操作
如果实现对不同数据库表,使用不同数据库对其进行操作时,只需增加对应表的抽象工厂即可;这里实现了对用户表的操作,当然也需要增加处理对应表的类
在这里插入图片描述这里只实现了,对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月的课件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yu_Nan___

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值