设计模式之工厂模式

简单工厂模式

​ 简单来说,就是有一个工厂类,有个静态方法,这个方法根据不同参数来返回实现了同一个接口或者继承了同一个类的类的实例对象。

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);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值