黑马程序员-抽象工厂模式

---------------------- <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>、期待与您交流! ----------------------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值