工厂模式之静态工厂模式和工厂方法模式

1.简介

工厂模式作用:实现了创建者和调用者的分离
详细分类:

  1. 静态工厂模式:用来生产同一等级结构中的任意产品(对于增加新的产品,需要覆盖已有的代码),又叫简单工厂模式

  2. 工厂方法模式:用来生产统一等级结构中的固定产品(支持增加的任意产品)

  3. 抽象工厂模式:围绕一个禅机共产创建其他工厂,该超级工厂又称为其他工厂的工厂(工厂的工厂)。

核心本质
实例化对象不使用new,用工厂方法代替。
将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦。
应用场景
JDK中Calendar的getInstance方法
JDBC中的Connection对象的获取
Spring中IOC容器创建管理bean对象
反射中Class对象的newInstance方法

2.静态工厂模式

/**
 * 静态工厂模式(简单工厂模式)
 * 大多数情况下都使用这种模式
 * 缺点:不满足开闭原则,每次增加一种类型,都需要在这里修改代码
 * 但是开闭原则需要付出比较大的代价
 */
public class CarFactory {
    //方法一
    public static Car getCar(String car){
        if(car.equals("小黄单车")){
            return new XiaoHuang();
        }else if (car.equals("小红单车")){
            return new XiaoHong();
        }else if (car.equals("小蓝单车")){
            return new XiaoLan();
        }else{
            return null;
        }
    }

    //方法二(将每一种车都自己创建一个方法)
    public static Car getXiaoHong(){
        return new XiaoHong();
    }
    public static Car getXiaoLan(){
        return new XiaoLan();
    }
    public static Car getXiaoHuang(){
        return new XiaoHuang();
    }
}

//顾客
public class Consumer  {
    public static void main(String[] args) {
    /*传统方法
        XiaoHong xh = new XiaoHong();
        xh.car();
        XiaoHuang xiaoHuang = new XiaoHuang();
        xiaoHuang.car();
    */
        
    /*  方法一
        Car c1 = CarFactory.getCar("小蓝单车");
        Car c2 = CarFactory.getCar("小红单车");
    */
  
    //方法二:
        Car c1 = CarFactory.getXiaoHong();
        Car c2 = CarFactory.getXiaoLan();

        c1.car();
        c2.car();

    }
}
//car接口
public interface Car {
    void car();
}
//每一种车型
public class XiaoLan implements Car {
    @Override
    public void car() {
        System.out.println("小蓝单车");
    }
}

在这里插入图片描述

3.工厂方法模式

/**
 * 工厂方法模式:需要哪个车就去哪个车的工厂去取
 * 优点:不修改已有代码的前提下,通过增加新的工厂类实现扩展
 * 缺点:类太多,比起简单工厂模式来说,虽然实现了开闭原则,但是很麻烦。
 */
//工厂接口
public interface CarFactory{
    Car getCar();
}
//每个车的工厂-小蓝车厂
public XiaoLanFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new XiaoLan();
    }
}
//每个车的工厂-小红车厂
public class HongFactory implements CarFactory {

    @Override
    public Car getCar() {
        return new XiaoHong();
    }
}
//车接口
public interface Car {
    void car();
}
//车产品-小蓝车
public class XiaoLan implements Car {
    @Override
    public void car() {
        System.out.println("小蓝单车");
    }
}
//车产品-小红车
public class XiaoHong implements Car {
    @Override public void car() {
        System.out.println("小红单车");
    }
}
//顾客
public class Consumer  {
    public static void main(String[] args) {

        //需要什么车,就去哪个车的工厂
        Car c1 = new LanFactory().getCar();
        Car c2 = new HongFactory().getCar();

        c1.car();
        c2.car();

    }
}

在这里插入图片描述

4.小结:

通过以下方面对比:
结构复杂度:选 静态工厂模式
代码复杂度:选 静态工厂模式
编程复杂度:选 静态工厂模式
管理上的复杂度:选 静态工厂模式

根据设计原则:选 工厂方法模式
根据实际业务:选 静态工厂模式

综上:
静态工厂模式:虽然某种程度上不符合设计原则,但实际使用最多。
工厂方法模式:不修改已有类的前提下,通过增加新的工厂类实现扩展。

( 简单提一下抽象工厂模式。)
抽象工厂模式:不可以增加产品,可以增加产品族。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值