抽象工厂模式
1.抽象工厂模式含义
抽象工厂,提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2.代码示例
以简单的JDBC代码实现来说明抽象工厂
2.1 IFactory类
IFactory是一个工厂接口,用于生产所需对象
public interface IFactory {
IUser createUser();
}
2.2 User类
public class User {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
2.3IUser类
IUser是一个接口类,用于抽象定义对用户的各种操作
public interface IUser {
void insert(User user);
User getUser(String name);
}
2.4MysqlFactory类
IFactory的具体实现类,mysql数据库访问实现方式
public class MysqlFactory implements IFactory{
@Override
public IUser createUser() {
return new MysqlUser();
}
}
2.5 PostgresqlFactory类
IFactory的具体实现类,postgresql数据库访问实现方式
public class PostgresqlFactory implements IFactory{
@Override
public IUser createUser() {
return new PostgresqlUser();
}
}
2.6MysqlUser类
IUser的具体实现类,mysql数据库访问实现方式
public class MysqlUser implements IUser{
@Override
public void insert(User user) {
System.out.println("mysql插入user方法");
}
@Override
public User getUser(String name) {
System.out.println("mysql查询User方法");
return null;
}
}
2.7PostgresqlUser类
IUser的具体实现类,Postgresql数据库访问实现方式
public class PostgresqlUser implements IUser{
@Override
public void insert(User user) {
System.out.println("postgresql插入User方法");
}
@Override
public User getUser(String name) {
System.out.println("postgresql查询User方法");
return null;
}
}
2.8测试类
public class MainApp {
public static void main(String[] args) {
User user = new User();
IFactory factory = new MysqlFactory();
// IFactory factory = new PostgresqlFactory();
IUser user1 = factory.createUser();
user1.insert(user);
user1.getUser("1");
}
}
运行结果
mysql插入user方法
mysql查询User方法
3.总结
抽象工厂模式是将工厂与产品都抽象化,这样在实例化工厂的时候,对具体对象的依赖就会变得很小,比如IFactory factory = new MysqlFactory();,当需要切换数据库到postgresql的时候,直接修改为IFactory factory = new PostgresqlFactory();即可,下面的User相关的代码全部不需要改动,因为它们都是接口依赖,而接口又不会改变,所以只需要改变很少的地方即可实现比较大的需求变动。
抽象工厂也有缺点,当新增产品的时候,就需要新增比较多的类,可以再借助简单工厂等方式结合抽象工厂使用,以降低对代码的新增。