一、定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
二、角色组成:抽象产品角色、具体产品角色、场景类、抽象工厂角色、具体工厂角色;
三、通用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;