设计模式太难学?JAVA设计模式之抽象工厂模式

设计模式太难学?

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



前言

之前学习了工厂方法模式。发现其在简单工厂模式上做了些优化,从而使得你的工厂符合开闭原则、具有良好的扩展性。但是发现工厂方法模式对于一些复杂的产品创建,会增加类文件个数,加大系统开销。所以为了适应复杂产品的创建,引申出了另外一种工厂设计模式-抽象工厂模式


一、抽象工厂模式

抽象工厂模式的角色跟工厂方法模式的角色一致。分为:抽象工厂、工厂实现类、抽象产品、产品实现类、客户端

抽象工厂模式的提出是为了解决复杂产品的创建问题,它跟工厂方法模式的区别就是:工厂不再只创建单个产品、而是创建一族产品。其实这个一族产品就是上面说的复杂产品。

那么什么是一族产品? 举个例子:你做了一套后台管理系统,卖给客户。客户要求系统的ui必须有不同的风格设计,比如界面颜色、按钮尺寸、按钮颜色等。用户可根据自由搭配出想要的ui展示。这里用户自由选择的不同风格的按钮、颜色等信息生成的ui界面就属于一族产品。它们之间不属于同一产品线、但是又相互有联系(用户建立的)。

那么什么是复杂的产品? 举个例子:假如你开了一家服装厂、你们主打的是业务是卖成套的校服。也就是说你必须完整且统一对外提供一套又一套的校服。这里的校服就是复杂的产品

本文,我们拿校服例子来理解:先简单的将一套校服分解成:上衣、裤子 两个部分

先来看这种情况下,如果使用工厂方法模式去设计代码,会怎么样:工厂方法模式下,想要对外提供一套完整的校服,那么就得创建两个工厂,一个工厂生产上衣、一个工厂生产裤子。然后再将它们组合起来对外出售。可是本来你的想法是只开一家工厂,现在却需要开两家工厂才能完成,这样就增加了你的管理运营成本。

下面看抽象工厂模式是怎么处理的:你需要一套校服是吧,可是我现在只有一个上衣生产工厂,没有裤子怎么办?我直接在我上衣工厂里增加一条流水线,专门生产裤子。这样就能正常成套对外售卖。

是的,抽象工厂模式就是这么简单粗暴,虽然这么做很有效的解决了我想要成套售卖校服的需求,但是这样却不符合开闭原则,假如我下次还想连鞋子跟衣服裤子一起成套卖,这样我就又得在我原有工厂里增加一条生产鞋子的流水线,这样下去我的工厂职责越来越不单一。当我的产品族里需要组合的产品多了后,我工厂里的业务也会越来越复杂。

二、代码演示

上面说抽象工厂和工厂方法模式的区别就是创建产品的不同,抽象工厂模式是创建一族产品,工厂方法模式是创建一种产品,对应到代码区别,其实就是抽象工厂模式下工厂类的实现方法比工厂方法模式多。
现在我们直接通过代码来演示下抽象工厂模式的示例。

抽象工厂模式

1、先创建抽象产品以及具体产品实现角色

package com.example.study.factory;

public interface Product {

     void make();
}

//上衣产品
package com.example.study.factory;
public class JacketProduct implements Product{
    @Override
    public void make() {
        System.out.println("生产一件上衣");
    }
}

//短裤产品
package com.example.study.factory;
public class ShortsProduct implements Product{
    @Override
    public void make() {
        System.out.println("生产一条短裤");
    }
}


创建抽象工厂角色,并声明该工厂需要生产那些产品

package com.example.study.factory;

public interface ClothesFactory {
    
    //生产上衣的流水线
    Product createJacket();

    //生产短裤的流水线
    Product createShorts();

    //提供完整的衣服
    void createClothes();
}

创建具体的工厂实现角色(只需要一个工厂实现类)

package com.example.study.factory;

public class ClothesFactoryImpl implements ClothesFactory{
    @Override
    public Product createJacket() {
        return new JacketProduct();
    }

    @Override
    public Product createShorts() {
        return new ShortsProduct();
    }

    @Override
    public void createClothes() {
        createJacket().make();
        createShorts().make();
        System.out.println("一套校服生产完成");
    }
}

接下来创建客户端角色来验证

package com.example.study.factory;

public class Client {

    public static void main(String[] args) {
        ClothesFactory clothesFactory = new ClothesFactoryImpl();
        clothesFactory.createClothes();

    }
}

运行结果:
在这里插入图片描述

工厂方法模式

如果用工厂方法模式来实现上诉需求的话,会比抽象工厂模式多增加一个类。需要创建两个工厂实现类,一个专门生产上衣、一个专门生产短裤。然后再组装。具体代码实现可参考上篇文章工厂方法模式

总结

抽象工厂方法:能创建复杂维度的产品,但是不符合开闭原则可扩展性差。适用于特定场景

工厂方法模式:符合开闭原则,但在复杂维度的产品组合下,会大大增加类文件个数,增加系统开销。适用于特定场景下

任何技术都没有百分百的完美,使用任何技术都得要个取舍,设计模式也不例外。使用工厂方法模式就得忍受类文件大量增加,使用抽象工厂模式就得忍受扩展性差问题。我们只能在适合的场景使用适合的设计模式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值