设计模式学习笔记之抽象工厂设计模式

抽象工厂,是提供一组接口,而不考虑实现。

比如我们有两个接口,IUser和IClass,负责往数据库里面添加信息。然后有OracleUser和OracleClass,负责往Oracle的数据库中添加信息。然后有SqlserverUser和SqlserverClass,负责往Sql server数据库中添加信息。那么,就需要一个抽象工厂,返回用户所需要的具体对象。

我们用properties来储存dbName信息,从而达到一修改即全修改的效果。不用if...else...语句进行判断,然后返回,而是用java的反射技术进行返回,从而达到最大限度的减少代码量的目的。

首先,是定义两个接口:

package AbstractFactory;

public interface IClass {

	public void addClass();
    public void deleteClass();
	public void modifyClass();
}


 

package AbstractFactory;

public interface IUser {

	public void addUser();
	public void deleteUser();
	public void modifyUser();
}


再就是,定义4个实现类:

package AbstractFactory;

public class OracleClass implements IClass{

	public void addClass() {
		
		System.out.println("Oracle add Class");
	}

	public void deleteClass() {
		
		System.out.println("Oracle delete Class");
	}

	public void modifyClass() {
		
		System.out.println("Oracle modify Class");
	}
}


 

package AbstractFactory;
public class SqlserverClass implements IClass{

	public void addClass() {
		
		System.out.println("Sql server add Class");
	}

	public void deleteClass() {
		
		System.out.println("Sql server delete Class");
	}

	public void modifyClass() {
		
		System.out.println("Sql server modify Class");
	}
}


 

package AbstractFactory;

public class OracleUser implements IUser{

	public void addUser() {
		
		System.out.println("Oracle add User");
	}

	public void deleteUser() {
		
		System.out.println("Oracle delete User");
	}

	public void modifyUser() {
		
		System.out.println("Oracle modify User");
	}
}


 

package AbstractFactory;

public class SqlserverUser implements IUser{

	public void addUser() {
		
		System.out.println("Sql server add User");
	}

	public void deleteUser() {
		
		System.out.println("Sql server delete User");
	}

	public void modifyUser() {
		
		System.out.println("Sql server modify User");
	}
}


然后,就是最为关键的抽象工厂类:

package AbstractFactory;
import java.io.IOException;
import java.util.Properties;
public class AbstractFactory {

	private String name;
	
	public AbstractFactory(){
		
		//从Properties文件读取
		Properties property = new Properties();
		try {
			property.load(AbstractFactory.class.getResourceAsStream("AbstractFactory.properties"));
			this.name = property.getProperty("dbName");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public IUser getUser(){
		
		try {
			
			return (IUser) Class.forName("AbstractFactory."+name+"User").newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	public IClass getClass1() {
		
		try {
			
			return (IClass) Class.forName("AbstractFactory."+name+"Class").newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}


测试抽象工厂的类:

package AbstractFactory;

public class AbstractFactoryTest {

	public static void main(String[] args){
		
		AbstractFactory factory = new AbstractFactory();
		
		IUser user = factory.getUser();
		user.addUser();
		user.deleteUser();
		user.modifyUser();
		
		IClass iclass = factory.getClass1();
		iclass.addClass();
		iclass.deleteClass();
		iclass.modifyClass();
	}
}


最后,就是对properties文件的定义:

dbName=Sqlserver

 

运行结果为:

Sql server add User
Sql server delete User
Sql server modify User
Sql server add Class
Sql server delete Class
Sql server modify Class

 

其实,我倒没觉得抽象工厂有多巧妙。但是,和Java的反射技术配合到一起,那真是绝妙啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值