初探设计模式(一)——工厂模式/抽象工厂模式

1、工厂模式

创建者不需要手动new一个要使用的对象,因为这样需要创建者对于对象实例的细节非常了解。以汽车生产为例,消费者想购买某种品牌的车,只需要到4s店进行消费,而不需要知道车的具体构造手动生产。工厂模式解决了这个问题。

​ 使用了工厂模式的场景非常多:

  • JDK中Calendar的getInstance方法
  • JDBC中Connection对象的获取
  • Spring中IOC容器创建管理bean对象
  • 反射中Class对象的newInstance方法
  • Mybatis中的sqlSessionFactory创建sqlSession对象

1.1、简单工厂模式

  • 不同品牌的汽车都实现了Car接口,如果想购买大众、五菱不同的牌子,按照原来的方法需要手动new两个牌子的汽车实例。而汽车工厂(CarFactory)可以让用户输入汽车品牌,得到对应的汽车实例。

在这里插入图片描述

//消费者在消费时需要知道每个子类汽车品牌的具体参数,才能拿到具体车的实例
public class Consumer {

    public static void main(String[] args) {
        //1.不使用工厂方法直接创建
        Car car1 = new WuLing();
        Car car2 = new Tesla();

        //2.使用简单工厂方法
        CarFactory.product("WuLing");
        CarFactory.product("Tesla");
    }
}
//汽车工厂只要输入想要购买的汽车型号,就可以给消费者生产出来想要的汽车
public class CarFactory {

    //但是如果要再新增一个汽车种类,基于必须更改本工厂方法
    public static Car product(String carName){
        if ("WuLing".equals(carName)) return new WuLing();
        if ("Tesla".equals(carName)) return new Tesla();
        return null;
    }
}

1.2、工厂方法模式

  • 简单工厂模式的基础上,如果想要新增一个汽车品牌,就需要对工厂进行改造,添加。这不符合设计模式的开闭原则(在对项目升级时,不对原有功能进行改动,只新增内容实现功能,达到横向拓展的目的)。

在这里插入图片描述

  • 工厂方法模式另外抽象出了一个工厂接口,定义了不同汽车工厂生产汽车的共同行为Car product();

    public interface CarMethodFactory {
        Car product();
    }
    
  • 不同的汽车工厂继承工厂接口并实现生产汽车的方法,达到生产不同品牌汽车的行为。

    public class TeslaFactory implements CarMethodFactory{
        @Override
        public Car product() {
            return new Tesla();
        }
    }
    
  • 消费者通过调用不同工厂的生产方法得到汽车实例。

    //消费者在消费时需要知道每个子类汽车品牌的具体参数,才能拿到具体车的实例
    public class Consumer {
    
        public static void main(String[] args) {
            //使用工厂方法
            new DaZhongFactory().product();
            new WuLingFactory().product();
            new TeslaFactory().product();
        }
    }
    

1.3、抽象工厂模式

  • 在工厂方法模式的基础上,如果要新增一个产品种类,例如特斯拉不但生产汽车,还会生产电池,此时消费者想要购买特斯拉的电池,也不希望直接new一个出来。那么在工厂方法的基础上,将工厂再抽象一层,抽象工厂接口定义了产品种类的生产,多个品牌的工厂实现这个抽象工厂接口,重写生产方法,生产该品牌不同种类的产品(品牌:特斯拉,不同种类的产品:汽车,电池)

在这里插入图片描述

  • 抽象工厂接口定义了产品种类的生产:

    public interface IAbstractFactory {
        //抽象工厂定义--手机的生产
        IPhone IphoneProduct();
        //抽象工厂定义--路由器的生产
        IRouter IRouterProduct();
    }
    
  • 多个品牌的工厂实现这个抽象工厂接口:

    public class HuaWeiFactory implements IAbstractFactory{
        @Override
        public IPhone IphoneProduct() {
          //工厂中会封装好生产华为手机的操作
            return new HuaWeiPhone();
        }
    
        @Override
        public IRouter IRouterProduct() {
          //工厂中会封装好生产华为路由器的操作
            return new HuaWeiRouter();
        }
    }
    
    public class XiaoMiFactory implements IAbstractFactory{
        @Override
        public IPhone IphoneProduct() {
          //工厂中会封装好生产小米手机的操作
            return new XiaoMiPhone();
        }
    
        @Override
        public IRouter IRouterProduct() {
          //工厂中会封装好生产小米路由器的操作
            return new XiaoMiRouter();
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值