怀旧网,博客详情:设计模式--工厂模式

1、设计模式介绍

2、设计模式--单例模式

3、设计模式--工厂模式

4、设计模式--抽象工厂模式

5、设计模式--建造者模式

6、设计模式--原型模式

7、设计模式--适配器模式

8、设计模式--桥接模式

9、设计模式--代理模式

原创

设计模式--工厂模式

工厂模式介绍

作用实现创建者与调用者的分离
详细分类简单工厂模式 、工厂方法模式 、抽象工厂模式
涉及原则开闭原则 、 依赖倒转原则 、迪米特法则

核心本质:

  • 实例化对象不使用new,用工厂方法代替
  • 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。

三种模式介绍:

  • 简单工厂模式:用来生产同一等级结构中的任意产品(对于增加新的产品,需要扩展已有代码)

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

  • 抽象工厂模式:围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

分类内容
简单工厂模式 (静态工厂模式)虽然某种程度上不符合设计原则,但实际使用最多
工厂方法模式满足开闭原则,不修改已有类的前提下,通过增加新的工厂实现扩展
抽象工厂模式不可以增加新产品,可以增加产品族
应用场景1.JDK的Calendar中getInstance方法
2.JDBC中Connection对象的获取
3.Spring中IOC容器创建管理bean对象
4.反射中Class对象的newInstance方法

简单工厂模式

image-20240604101904714

// ---------- 接口 ---------- 
public interface Car {
    public void name();
}
// ---------- 两个实现类: ---------- 
public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}
public class Wuling implements Car {
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}
/* ---------- 简单工厂模式,又称静态工厂模式 ---------- 
	缺点:不满足开闭原则。如果新增一个车型(大众),则车工厂需要改代码
*/
public class CarFactory {
    //简单工厂方法一:
    public static Car getCar(String carName){
        if(carName.equals("五菱")){
            return new Wuling();
        }else if(carName.equals("特斯拉")){
            return new Tesla();
        }else{
            return null;
        }
    }
    //简单工厂方法二:
    public static Car getWuling(){
        return new Wuling();
    }
    public static Car getTesla(){
        return new Tesla();
    }
}
// ---------- 消费者 ---------- 
public class Consumer {
    public static void main(String[] args) {
        Car wuling = CarFactory.getCar("五菱");
        Car tesla = CarFactory.getCar("特斯拉");

        wuling.name();  //输出:五菱宏光
        tesla.name();   //输出:特斯拉
    }
}

在使用的时候,要是新增了一个车类型,我们就需要重新修改原有的代码:与设计思想违背,所以就提出了下面的设计模式。

工厂方法模式

image-20240604102217666

// ---------- 接口 ---------- 
public interface Car {
    public void name();
}
// ---------- 两个实现类: ---------- 
public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}
public class Wuling implements Car {
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}
/* ---------- 方法工厂模式:每个实现类,分别创建一个工厂 ---------- 
 优点:满足开闭原则,新增一个车型,不用修改原代码
 缺点:代码量明显增加
*/
public interface CarFactory {
    public Car getCar();
}
//特斯拉工厂,只生产特斯拉
public class TeslaFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Tesla();
    }
}
//五菱工厂,只生产五菱
public class WulingFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Wuling();
    }
}
// ---------- 消费者:通过特定的工厂,生产特定的车 ---------- 
public class Consumer {
    public static void main(String[] args) {
        Car wuling = new WulingFactory().getCar();
        Car tesla = new TeslaFactory().getCar();

        wuling.name();  //输出:五菱宏光
        tesla.name();   //输出:特斯拉
    }
}
对比项结果
结构复杂度简单工厂模式,更简单
代码复杂度简单工厂模式,更简洁
编程复杂度简单工厂模式,更容易
管理复杂度简单工厂模式,更易管理
开闭原则简单工厂模式,不满足
方法工厂模式,满足

根据设计原则,应采用工厂方法模式 根据实际业务,简单工厂模式,应用更广泛

  • 平台作者:怀旧(联系作者)
  • QQ:444915368
  • 邮箱:444915368@qq.com
  • 电话:17623747368
  • 评论

    登录后才可以进行评论哦!

    回到顶部 留言