简单工厂模式
简单来说,就是有一个工厂类,有个静态方法,这个方法根据不同参数来返回实现了同一个接口或者继承了同一个类的类的实例对象。
public class HumanFactory {
public static Human createHuman(HumanEnum humanEnum) {
Human human;
switch (humanEnum) {
case MAN:
human = new Man();
break;
case WOMAN:
human = new Woman();
break;
default:
human = null;
}
return human;
}
}
工厂模式
它定义一个拥有创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
对简单工厂模式而言,如果我们要新增一个功能,如上面代码要返回一个人妖的实例,就要在人类工厂类的方法里新增一个case分支。这样做就修改个原有的类,这就违反了开放-封闭原则,即对扩展开发,对修改进行闭合。所以工厂模式就出现了。
/**
* 先构建一个人类工厂接口
*/
public interface IHumanFactory {
/**
* 创建一个生成人类的方法
* @return
*/
Human createHuman();
}
/**
* 男人工厂去实现人类工厂接口,来创建相关实例
*/
public class ManFactory implements IHumanFactory {
@Override
public Human createHuman() {
return new Man();
}
}
/**
* 女人工厂去实现人类工厂接口,来创建相关实例
*/
public class WomanFactory implements IHumanFactory {
@Override
public Human createHuman() {
return new Woman();
}
}
/**
* 客户端调用
*/
public class FactoryApp {
public static void main(String[] args) {
//选择一个具体工厂
IHumanFactory manFactory = new ManFactory();
//调用方法生成相关实例
manFactory.createHuman();
}
}
抽象工厂模式
抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。它主要解决涉及多个产品系列的问题。最大优点就是便于交换产品系列,只需要改变具体的工厂就可以使用不同的产品配置。
/**
* 抽象工厂接口,包含创建所有产品的抽象方法
*/
public interface IDaFactory {
/**
* 创建访问用户表数据接口
*/
IUserDao createUserDao();
/**
* 创建访问菜单表数据接口
*/
IMenuDao createMenuDao();
}
/**
* OracleFactory用于创建OracleUserDao和OracleMenuDao
*/
public class OracleFactory implements IDaFactory {
@Override
public IUserDao createUserDao() {
return new OracleUserDao();
}
@Override
public IMenuDao createMenuDao() {
return new OracleMenuDao();
}
}
/**
* MySqlFactory用于创建MysqlUserDao和MysqlMenuDao
*/
public class MySqlFactory implements IDaFactory {
@Override
public IUserDao createUserDao() {
return new MySqlUserDao();
}
@Override
public IMenuDao createMenuDao() {
return new MySqlMenuDao();
}
}
/**
* 访问用户表数据的接口,解除与具体具体数据库访问的耦合
*/
public interface IUserDao {
User findUserById(Integer id);
int save(User user);
}
/**
* 用于访问MySQL数据库的User表,并进行相关操作
*/
public class MySqlUserDao implements IUserDao {
@Override
public User findUserById(Integer id) {
System.out.println("在MySQL中,根据id查找对应的User表中的记录");
return new User();
}
@Override
public int save(User user) {
System.out.println("在MySQL中,插入一条记录到User表中");
return 1;
}
}
/**
* 用于访问Oracle数据库的User表,并进行相关操作
*/
public class OracleUserDao implements IUserDao {
@Override
public User findUserById(Integer id) {
System.out.println("Oracle中,根据id查找对应的User表中的记录");
return new User();
}
@Override
public int save(User user) {
System.out.println("在Oracle中,插入一条记录到User表中");
return 1;
}
}
/**
* 客户端调用
*/
public class FactoryApp {
public static void main(String[] args) {
//只需要确定实例化哪个数据库访问对象给factory就可以
//IDaFactory daFactory = new MySqlFactory();
IDaFactory daFactory = new OracleFactory();
IMenuDao menuDao = daFactory.createMenuDao();
menuDao.save(new Menu());
menuDao.findMenuById(1);
IUserDao userDao = daFactory.createUserDao();
userDao.save(new User());
userDao.findUserById(1);
}
}