简单_普通_抽象工厂模式

1、简单工厂模式

简单工厂模式:一个工厂、一种产品的不同型号。
比如:宝马车工厂,生产宝马车,可以生产宝马320、宝马330(不论真实是否有,只是学术举例)
工厂模式个人理解,好比有了销售部,假如之前需要,必须要到对应车间去,现在直接找销售说自己想要的型号就好了,宝马车会直接给到你。

1、产品类

public class BMW {
}
public class BMW320 extends BMW{
    public BMW320() {
        System.out.println("BMW320.BMW320");
    }
}
public class BMW330 extends BMW{
    public BMW330() {
        System.out.println("BMW330.BMW330");
    }
}

2、工厂类

public class BMWFactory {
    public BMW createBMW(int type) {
        switch (type) {
            case 330:
                return new BMW330();
            case 320:
                return new BMW320();
            default:
                return null;
        }
    }
}

3、使用类

public class TestFactory {
    public static void main(String[] args) {
        BMWFactory bmwFactory = new BMWFactory();
        bmwFactory.createBMW(320);
        bmwFactory.createBMW(330);
    }
}

4、输出

BMW320.BMW320
BMW330.BMW330

2、工厂模式

工厂模式:一个抽象工厂,多个具体工厂,一种产品的抽象类及产品的多个类型实现,一个工厂实现只能生产一类产品。
比如:
一个抽象工厂:抽象宝马车工厂,
多个具体工厂:宝马320工厂、宝马330工厂,
一种产品的抽象类及产品实现:宝马车抽象类、宝马320实现类、宝马330实现类
缺点:产品新增一个类型,需要增加一个产品实现类和一个新类型的工厂

0、类图

image.png

1、产品类

public class BMW {
}

public class BMW320 extends BMW{
    public BMW320() {
        System.out.println("BMW320.BMW320");
    }
}

public class BMW330 extends BMW{
    public BMW330() {
        System.out.println("BMW330.BMW330");
    }
}

2、工厂类

public interface BMWFactory {
    BMW createBMW();
}

public class BMW320Factory implements BMWFactory{
    @Override
    public BMW createBMW() {
        return new BMW320();
    }
}

public class BMW330Factory implements BMWFactory{
    @Override
    public BMW createBMW() {
        return new BMW330();
    }
}

3、使用类

public class TestFactory {
    public static void main(String[] args) {
        BMW320Factory bmw320Factory = new BMW320Factory();
        bmw320Factory.createBMW();
        BMW330Factory bmw330Factory = new BMW330Factory();
        bmw330Factory.createBMW();
    }
}

4、输出

BMW320.BMW320
BMW330.BMW330

5、增加要求:生产宝马340

新增一个产品实现类、一个工厂类,不需要修改原来的设计逻辑,符合开闭原则
产品实现类

public class BMW340 extends BMW {
    public BMW340() {
        System.out.println("BMW340.BMW340");
    }
}

工厂类

public class BMW340Factory implements BMWFactory{
    @Override
    public BMW createBMW() {
        return new BMW340();
    }
}

使用类

public class TestFactory {
    public static void main(String[] args) {
        BMW320Factory bmw320Factory = new BMW320Factory();
        bmw320Factory.createBMW();
        BMW330Factory bmw330Factory = new BMW330Factory();
        bmw330Factory.createBMW();
        BMW340Factory bmw340Factory = new BMW340Factory();
        bmw340Factory.createBMW();
    }
}
输出结果

BMW320.BMW320
BMW330.BMW330
BMW340.BMW340

3、抽象工厂模式

产品等级结构和产品族结构示意图:
image.png
产品等级结构产品等级结构即产品的继承结构
如一个抽象类是冰箱,其子类有海尔冰箱、美的冰箱、小米冰箱、苏泊尔冰箱,则抽象冰箱与具体品牌的冰箱之间构成了一个产品等级结构,抽象冰箱是父类,而具体品牌的冰箱是其子类。
产品族产品族是指由同一个工厂生产的(此处的工厂指的是工厂的实现类),位于不同产品等级结构中的一组产品
如海尔电器工厂生产的海尔冰箱、海尔电饭锅、海尔扫地机器人,
海尔冰箱位于冰箱产品等级结构中,
海尔电饭锅位于电饭锅产品等级结构中,
海尔扫地机器人位于扫地机器人产品等级结构中,
海尔冰箱、海尔电饭锅、海尔扫地机器人构成了一个产品族,海尔产品族。

下面类图和代码实现,
产品族有2022、2023,最后扩展了2024,对应现实生活中的产品迭代,2022款、2023款,也可以类比,比如长安汽车的55plus、65plus、75plus。
产品等级结构有2种,冰箱和扫地机器人
后续有时间会画一个代码实现的产品族和产品等级结构图,或者实现上述图。

0、类图如下

image.png

1、产品类

/**
 * 小米冰箱
 */
public class Refrigerator {
}

/**
 * 小米冰箱2022
 */
public class Refrigerator2022 extends Refrigerator {
    public Refrigerator2022() {
        System.out.println("Refrigerator2022.Refrigerator2022");
    }
}

/**
 * 小米冰箱2023
 */
public class Refrigerator2023 extends Refrigerator {
    public Refrigerator2023() {
        System.out.println("Refrigerator2023.Refrigerator2023");
    }
}

/**
 * 小米扫地机器人
 */
public class SweepingRobot {
}

/**
 * 小米扫地机器人2022
 */
public class SweepingRobot2022 extends SweepingRobot {
    public SweepingRobot2022() {
        System.out.println("SweepingRobot2022.SweepingRobot2022");
    }
}

/**
 * 小米扫地机器人2023
 */
public class SweepingRobot2023 extends SweepingRobot {
    public SweepingRobot2023() {
        System.out.println("SweepingRobot2023.SweepingRobot2023");
    }
}

2、工厂类

/**
 * 小米抽象工厂类
 *
 * 实战应用中应该是抽象类,抽象类比接口灵活很多
 */
public interface XMFactory {
    /**
     * 生产小米冰箱
     */
    Refrigerator  createRefrigerator();

    /**
     * 生产小米
     * @return
     */
    SweepingRobot createSweepingRobot();
}

/**
 * 小米抽象工厂类2022
 */
public class XMFactory2022 implements XMFactory{
    @Override
    public Refrigerator  createRefrigerator(){
        return new Refrigerator2022();
    }
    @Override
    public SweepingRobot createSweepingRobot(){
        return new SweepingRobot2022();
    }
}

/**
 * 小米抽象工厂类2023
 */
public class XMFactory2023 implements XMFactory {
    @Override
    public Refrigerator createRefrigerator() {
        return new Refrigerator2023();
    }

    @Override
    public SweepingRobot createSweepingRobot() {
        return new SweepingRobot2023();
    }
}

3、使用类

public class Client {
    public static void main(String[] args) {
        System.out.println("生产2022版小米产品开始...............");
        XMFactory2022 xmFactory2022 = new XMFactory2022();
        xmFactory2022.createSweepingRobot();
        xmFactory2022.createRefrigerator();
        System.out.println("生产2022版小米产品结束...............\n");

        System.out.println("生产2023版小米产品开始...............");
        XMFactory2023 xmFactory2023 = new XMFactory2023();
        xmFactory2023.createRefrigerator();
        xmFactory2023.createSweepingRobot();
        System.out.println("生产2023版小米产品结束...............");
    }
}

4、输出

生产2022版小米产品开始...............
SweepingRobot2022.SweepingRobot2022
Refrigerator2022.Refrigerator2022
生产2022版小米产品结束...............

生产2023版小米产品开始...............
Refrigerator2023.Refrigerator2023
SweepingRobot2023.SweepingRobot2023
生产2023版小米产品结束...............

5、增加要求:生产2024款产品

/**
* 小米冰箱2024
*/
public class Refrigerator2024 extends Refrigerator {
    public Refrigerator2024() {
        System.out.println("Refrigerator2024.Refrigerator2024");
    }
}

/**
 * 小米扫地机器人2024
 */
public class SweepingRobot2024 extends SweepingRobot {
    public SweepingRobot2024() {
        System.out.println("SweepingRobot2024.SweepingRobot2024");
    }
}

/**
 * 小米抽象工厂类2024
 */
public class XMFactory2024 implements XMFactory {
    @Override
    public Refrigerator createRefrigerator() {
        return new Refrigerator2024();
    }

    @Override
    public SweepingRobot createSweepingRobot() {
        return new SweepingRobot2024();
    }
}

public class Client {
    public static void main(String[] args) {
        System.out.println("生产2022版小米产品开始...............");
        XMFactory2022 xmFactory2022 = new XMFactory2022();
        xmFactory2022.createSweepingRobot();
        xmFactory2022.createRefrigerator();
        System.out.println("生产2022版小米产品结束...............\n");

        System.out.println("生产2023版小米产品开始...............");
        XMFactory2023 xmFactory2023 = new XMFactory2023();
        xmFactory2023.createRefrigerator();
        xmFactory2023.createSweepingRobot();
        System.out.println("生产2023版小米产品结束...............\n");

        System.out.println("生产2024版小米产品开始...............");
        XMFactory2024 xmFactory2024 = new XMFactory2024();
        xmFactory2024.createRefrigerator();
        xmFactory2024.createSweepingRobot();
        System.out.println("生产2024版小米产品结束...............\n");
    }
}
生产2022版小米产品开始...............
SweepingRobot2022.SweepingRobot2022
Refrigerator2022.Refrigerator2022
生产2022版小米产品结束...............

生产2023版小米产品开始...............
Refrigerator2023.Refrigerator2023
SweepingRobot2023.SweepingRobot2023
生产2023版小米产品结束...............

生产2024版小米产品开始...............
Refrigerator2024.Refrigerator2024
SweepingRobot2024.SweepingRobot2024
生产2024版小米产品结束...............

总结

工厂模式可以生产一种产品的多类型实体,即一个产品等级结构,即一个抽象产品类,多个实现产品子类
抽象工厂模式可以生产多种产品的多类型实体,即多个产品等级结构,即多个抽象产品类,多个实现产品子类。

抽象工厂模式的优点:
比如要实现生产3个产品等级结构,每种产品结构有3种产品族
用工厂模式实现,需要9个工厂实现类,用抽象工厂模式只需要3个,数字越大,比例优势越明显

抽象工厂模式的缺点:
抽象工厂模式需要新增一种产品族的时候,是比较方便的,是符合开闭原则的,
但是新增一种产品等级结构时,是比较麻烦的,需要修改之前所有的实现类,违背开闭原则的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不积跬步无以至千里-陕西西安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值