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

一、定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

二、角色组成:抽象产品角色、具体产品角色、场景类、抽象工厂角色、具体工厂角色;

三、通用UML图:

 

 

 

四、示例:不同数据库下操作不同的表(课本例子)

1、抽象产品角色:IUser、IDeparment

2、具体产品角色:AccessUser、OracleUser、AccessDeparment、OracleDeparment。

3、抽象工厂角色:IFactory

4、具体工厂角色:AccessServeFactory、OracleSeverFactory

 

UML图:(产品族、产品等级结构弄错了,,,,

 

 

代码实现:

抽象产品角色:

package 课本数据库例子;

public interface IDepartment {
	public abstract String getName();
}


public interface IUser {
	public abstract  String getName();

}

 

具体产品角色:



public class AccessServerDeparment implements IDepartment {
	public String getName() {
		return "AccessDepartment";
	}
	
}



public class AccessServerUser implements IUser {
	public String getName() {
		return "AccessUser";
	}
}



public class OracleServerDeparment implements IDepartment{

	@Override
	public String getName() {
		return "OracleDepetment";
	}
	
}




public class OracleServerUser implements IUser {

	@Override
	public String getName() {
		return "OracleUser";
	}
	
}

 

抽象工厂角色:

package 课本数据库例子;

public interface IFactory {
	public abstract IUser createUser();
	public abstract IDepartment createDepartment();

}

 

具体工厂角色:

package 课本数据库例子;

public class OracleServerFactory implements IFactory{

	@Override
	public IUser createUser() {
		System.out.println("已经创建Oracle中User");
		return new OracleServerUser();
	}

	@Override
	public IDepartment createDepartment() {
		System.out.println("已经创建Oracle中Department");
		return new OracleServerDeparment();
	}

}




public class AccessServerFactory implements IFactory {

	@Override
	public IUser createUser() {
		System.out.println("已经创建了Access中User");
		return new AccessServerUser();
	}

	@Override
	public IDepartment createDepartment() {
		System.out.println("已经创建了Access中Department");
		return  new AccessServerDeparment();
	}
	

}

 

场景类:

package 课本数据库例子;

public class Client {

	public static void main(String[] args) {
		IFactory f=new AccessServerFactory();
		IFactory d2=new OracleServerFactory();
		
		//Access
		IUser user=f.createUser();
		IDepartment dep1=f.createDepartment();
		
		//Oracle
		
		IDepartment  dep=d2.createDepartment();
		IUser user2=d2.createUser();
		
		
		
		String str1=user.getName();
		String str2=dep.getName();
		String str3=user2.getName();
		String str4=dep1.getName();
		System.out.println("user:"+str1);
		System.out.println("dep:"+str2);
		System.out.println("user2:"+str3);
		System.out.println("dep1:"+str4);
	}

}

 

 

 

示例二:PPT 简单工厂+反射/依赖注入 优化:

package 不同数据库访问不同文件_简单工厂;


//抽象产品角色1
public interface IDepartment {
	public abstract String getName();
}

//抽象产品角色2
public interface IUser {
	public abstract  String getName();

}



//简单工厂
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
//简单工厂类
public class DataAccess {
	
	private static String dbName=null;
	
	public void setDBName(String str) throws IOException {
		dbName=getValue(str);
	}
	
	
	@SuppressWarnings("deprecation")
	public static IUser createUser() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
		
		dbName=getValue("dataBase1");
		
		
		String obj="不同数据库访问不同文件_简单工厂"+".";
		obj+=dbName+"Server"+"User";
		//运行时类名:不同数据库访问不同文件_简单工厂.OracleServerUser
		System.out.println(",,,,"+obj);
		Class<?> c=Class.forName(obj);
		return (IUser) c.newInstance();
		
	}
	
	
	@SuppressWarnings("deprecation")
	public static IDepartment createDepartment() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
		
		dbName=getValue("dataBase1");
		
		
		String obj="不同数据库访问不同文件_简单工厂"+".";
		obj+=dbName+"Server"+"Deparment";
		Class<?> c=Class.forName(obj);
		return (IDepartment) c.newInstance();
		
	}
	
	public static String getValue(String str) throws IOException {
		Properties p=new Properties();
		String file="E:\\JAVA\\javaEE\\抽象工厂模式\\bin\\不同数据库访问不同文件_简单工厂\\input.txt";
		FileReader f=new FileReader(file);
		p.load(f);
		//f.close();
		
		return p.getProperty(str);
		
		
	}

}


//具体产品角色
public class AccessServerUser implements IUser {
	public String getName() {
		return "AccessUser";
	}
}

//具体产品角色
public class OracleServerDeparment implements IDepartment{

	@Override
	public String getName() {
		return "OracleDepetment";
	}
	
}

//具体产品角色
public class OracleServerUser implements IUser {

	@Override
	public String getName() {
		return "OracleUser";
	}
	
}

//具体产品角色
public class AccessServerDeparment implements IDepartment {
	public String getName() {
		return "AccessDepartment";
	}
	
}

 

 

 

The end;

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值