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

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

比如我们有两个接口,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的反射技术配合到一起,那真是绝妙啊。

你可能感兴趣的:(设计模式学习笔记之抽象工厂设计模式)