简单工厂模式,工厂方法模式----工厂模式

本文详细解析了工厂模式的作用、核心本质及详细分类,包括简单工厂、工厂方法和抽象工厂模式,并通过示例代码展示了如何实现这些模式。

作用

实现了创建者和使用者的分离

核心本质

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

详细分类

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

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

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

关于简单工厂的学习

Car接口:车的实现模板

public interface Car {
    void name();
}

Car1:实现Car接口的实现类

public class Car1 implements Car {
    @Override
    public void name() {
        System.out.println("car1");
    }
}

Car2:实现Car接口的实现类

public class Car2 implements Car {
    @Override
    public void name() {
        System.out.println("car2");
    }
}

CarFactory: 用于生产车的实例对象的工厂类

//不满足开闭原则
public class CarFactory {

    //方法一: 静态工厂方法,违背开闭原则
    public static Car getCar(String carName){
        if ("car1".equals(carName)){
            return new Car1();
        }else if ("car2".equals(carName)){
            return new Car2();
        }
        return null;
    }

    //方法二: 无需关系创建细节,直接new,然后返回
    public  static  Car1 getCar1(){
        return new Car1();
    }

    public  static  Car2 getCar2(){
        return new Car2();
    }
}
  • 方法一为静态工厂方法,如果新增一个车类产品的话,需要对原来的类进行修改,违背了开闭原则,而且我们对于创建的细节进行处理
  • 方法二,如果新增一个车类产品的话,只是不需要改动原来的逻辑,但是这也改动了原来的类,不满足开闭原则

test:测试类

/**
 * 工厂方法(静态工厂方法):不符合开闭原则,但是实际上使用的最多
 */
public class test {
    public static void main(String[] args) {
        //普通new对象
//        Car1 car1 = new Car1();
//        Car2 car2 = new Car2();
//        car1.name();
//        car2.name();

        /**使用工厂去生成对象,不使用new,解耦
           缺点:当公司新出一个产品car3的时候,
                我们需要到carFactory里面在写一个相关的生成对象代码
                违背了开闭原则(对某个实体,只进行扩展,而不进行修改代码)
         **/
        Car car1 = CarFactory.getCar("car1");
        Car car2 = CarFactory.getCar("car2");
        car1.name();
        car2.name();
        //
    }
}

在这里插入图片描述

大白话:一个车工厂里面,什么车都在一个工厂生产。

关于工厂方法的学习

在上面的基础上,修改工厂方法

CarFactory 接口:车工厂生产的模板

public interface CarFactory {
    public Car getCar();
}

Car1Factory :用于生产Car1的专门工厂

public class Car1Factory implements CarFactory {
    @Override
    public Car getCar() {
        return new Car1();
    }
}

Car2:用于生产Car2的工厂

public class Car2Factory implements CarFactory {
    @Override
    public Car getCar() {
        return new Car2();
    }
}

test:测试类

/**
 * 工厂方法模式;在不修改原来的类的基础上,进行新增的工厂类横向扩展
 */
public class test {
    public static void main(String[] args) {
        Car car1 = new Car1Factory().getCar();
        Car car2 = new Car2Factory().getCar();
        car1.name();
        car2.name();
    }
}

在这里插入图片描述

大白话:一个生产车的工厂里面,每辆车都会细分对于的车工厂,比如说宝马车工厂专门生产宝马,大奔的车工厂专门生产大奔。对不同的车区分出不同的工厂去生产。

这样的话,当新增一个产品的时候,就不需要修改原来的类了,就不会违背开闭原则,但是需要增加很多的类,这也是非常麻烦!!!

在我们实际开发中,使用简单工厂方法比工厂方法模式更多。所以说不一定说要满足oop七大原则才使用得多,都是根据需求和环境所更改的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值