抽象工厂模式
来源:互联网 发布:在windows上编写swift 编辑:程序博客网 时间:2024/06/07 15:58
抽象工厂模式:为一组相关或者相互依赖的对象提供一个接口,而且无需指定他们的具体类。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
用了工厂方法模式的数据访问程序
User.java用户类(只有ID和Name两个字段)
public class User { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }}
IUser.java-用于对User进行操作的通用接口
public interface IUser { void insert(User user); User getUser(int id);}
AccessUser.java-对数据库操作的具体实现
public class AccessUser implements IUser{ @Override public void insert(User user) { System.out.println("在Access中给User表增加一条记录"); } @Override public User getUser(int id) { System.out.println("在Access中根据ID获取User表中的一条记录"); return null; }}
SqlServerUser.java-对数据库操作的具体实现
public class SqlServerUser implements IUser{ @Override public void insert(User user) { System.out.println("在SQL Server中给User表增加一条记录"); } @Override public User getUser(int id) { System.out.println("在SQL Server中根据ID获取User表中的一条记录"); return null; }}
IFactory.java-用于创建访问user表的对象
public interface IFactory { IUser createUser();}
sqlServerFactory.java-实现IFactory接口,创建sqlServerUser对象
public class SqlServerFactory implements IFactory{ @Override public IUser createUser() { return new SqlServerUser(); }}
AccessFactory.java-实现IFactory接口,创建AccessUser对象
public class AccessFactory implements IFactory{ @Override public IUser createUser() { return new AccessUser(); }}
测试
public class Test { public static void main(String[] args) { User user = new User(); SqlServerFactory sqlServerFactory = new SqlServerFactory(); IUser createUser = sqlServerFactory.createUser(); createUser.insert(user); createUser.getUser(1); }}
输出
改进(去除IFactory、SqlServerFactory、AccessFactory三个工厂,取而代之DataAccess类,用一个简单工厂模式实现)
DataAccess.java
public class DataAccess { private static final String db="SqlServer";// private static final String db="Access"; public static IUser createUser(){ IUser result=null; switch(db){ case "SqlServer":result=new SqlServerUser(); break; case "Access":result=new AccessUser();break; } return result; } public static IDepartment createDepartment(){ IDepartment result=null; switch(db){ case "SqlServer":result=new SqlServerDepartment(); break; case "Access":result=new AccessDepartment();break; } return result; }}
测试
public class Test2 { public static void main(String[] args) { User user = new User(); Department department = new Department(); IUser iu = DataAccess.createUser(); IDepartment id = DataAccess.createDepartment(); iu.insert(user); iu.getUser(1); id.insert(department); id.getUser(1); }}
用反射+抽象工厂进行数据访问
通过反射实现程序由编译时创建对象变为运行时创建对象,通过字符串来实例化对象。
DataAccessR类利用反射技术,取代IFactory、SqlServerFactory、AccessFactory三个工厂
DataAccessR.java
public class DataAccessR { private static final String commonPackageName="zx.abstractfactory.test2"; private static final String db="sqlserver"; public static IUser createUser() throws InstantiationException, IllegalAccessException, ClassNotFoundException{ String className=commonPackageName+"."+db+".SqlServerUser"; System.out.println("SqlServerUser的全路径名 "+className); IUser sqlServerUser=(SqlServerUser)Class.forName(className).newInstance(); return sqlServerUser; } public static IDepartment createDepartment() throws InstantiationException, IllegalAccessException, ClassNotFoundException{ String className=commonPackageName+"."+db+".SqlServerDepartment"; System.out.println("SqlServerDepartment的全路径名 "+className); IDepartment sqlServerDepartment=(SqlServerDepartment)Class.forName(className).newInstance(); return sqlServerDepartment; }}
测试
public class TestR { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { User user = new User(); Department department = new Department(); IUser createUser = DataAccessR.createUser(); IDepartment createDepartment = DataAccessR.createDepartment(); createUser.insert(user); createUser.getUser(1); createDepartment.insert(department); createDepartment.getUser(1); System.out.println("testR"); }}
输出
0 0
- 工厂模式 -- 抽象工厂
- 工厂模式-抽象工厂
- 工厂模式-抽象工厂
- 工厂模式/抽象工厂模式
- 工厂模式&&抽象工厂模式
- 工厂模式---抽象工厂模式
- 工厂模式&抽象工厂模式
- 工厂模式,抽象工厂模式
- 【模式】抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂&工厂模式&抽象工厂模式
- 工厂方法,抽象工厂模式
- 2,工厂模式--抽象工厂
- C#工厂模式-抽象工厂
- 工厂模式与抽象工厂
- 抽象工厂设计模式
- 抽象工厂模式
- Android高级组件之自动完成文本框
- static 静态修饰符
- SQL_1th_数据库初步认识
- CString转十六进制数字
- C++11 智能指针
- 抽象工厂模式
- appium 初学
- SpringData JPA @Query分页查询Exception问题解决方案
- 菱形继承&菱形虚拟继承
- 侧滑
- tomcat开启远程调试
- SpringMVC ModelAttribtue注解
- HTML标记的知识点
- pkg-config 工具的介绍与使用