栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式太难学?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();

    }
}

运行结果:

工厂方法模式

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

总结

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/851713.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号