小菜写的第二份代码:
1、用户类(不变):User
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;
}
}
2、IUser接口
public interface IUser {
void Insert(User user);
User GetUser(int id);
}
3、实现IUser接口:SqlserverUser、AccessUser
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;
}
}
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;
}
}
4、IFactory接口
定义一个创建访问User表对象的抽象工厂接口
工厂方法:CreateUser() 返回一个IUser类型对象
public interface IFactory {
IUser CreateUser();
}
5、实现IFactory接口:SqlServerFactory、AccessFactory
public class SqlServerFactory implements IFactory {
@Override
public IUser CreateUser() {
return new SqlserverUser();
}
}
public class AccessFactory implements IFactory {
@Override
public IUser CreateUser() {
return new AccessUser();
}
}
6、客户端代码
public class AbstractFactory2Demo {
public static void main(String[] args) {
User user = new User();
IFactory factory = new SqlServerFactory();
IUser iu = factory.CreateUser();
iu.Insert(user);
iu.GetUser(1);
}
}
7、输出结果
在SQL Server中给User表增加一条记录
在Sql Server中根据ID得到User表一条记录
总结:其实吧,抽象工厂模式就是工厂,那生产什么呢?就是对象,例如上述代码:
public IUser CreateUser() {
return new SqlserverUser();
}
public IUser CreateUser() {
return new AccessUser();
}
接口IFactory规定了生产种类:IUser CreateUser();
;就比如说规定生产可乐,但可以生产可口可乐也可以生产百事可乐。
故IUser接口被多次不同地实现:SqlserverUser、AccessUser;两个就分别表示可口、百事:
return new SqlserverUser();
return new AccessUser();