【设计模式】秒懂简单工厂模式

码农有道公众号

共 5664字,需浏览 12分钟

 ·

2022-07-04 17:34

简单工厂模式介绍

概述

工厂模式是一种常见的创建型模式,即讨论的是如何创建一个类的对象的问题。也许你会说,创建一个对象还不简单哈,用new不就可以了吗,好吧,你说的没错,但是如果你能够用一种高逼格的方式将对象创建出来,是不是会让你的leader刮目相看了?掌握了工厂模式就可以让你做到这一点。

在 GoF 的《设计模式》一书中,工厂模式(Factory Design Pattern)一共分为三种:简单工厂模式、工厂方法和抽象工厂。今天我们来介绍其中最简单的简单工厂模式

使用场景

学习一种设计模式,我觉得最重要的一点之一就是你需要充分理解每种设计模式的使用场景。

当你想创建一个对象的时候,如果出现了以下几种情况,那么可以考虑是不是该用工厂模式了:

  • • 1.不想直接new这个类的对象,防止这个类改变的时候在new的地方到处去改,麻烦且容易遗漏;

  • • 2.这个类的对象构建过程非常复杂,不想在代码的各个地方将这么复杂的构建过程反复书写;

  • • 3.这个类的对象在构建过程中依赖了很多其他的类,而你无法在调用的地方提供。

UML类图

业务场景:小明是个运动鞋大亨,他承包了耐克和阿迪达斯两个品牌的运动鞋的生产,我们如何用代码实现这个业务呢?

下面是简单工厂模式的UML图:

简单工厂模式实现

简单工厂模式实现

以上面的业务场景为例,可以按照下面的方式写出对应的简单工厂模式的代码。

//1.定义鞋这种产品的抽象基类
abstract class Shoes{
    public abstract void showLogo();
}

//2.定义具体品牌的鞋类,继承鞋抽象基类
class NikeShoes extends Shoes{
    @Override
    public void showLogo() {
        System.out.println("我是耐克鞋子");
    }
}

//2.定义具体品牌的鞋类,继承鞋抽象基类
class AdidasShoes extends Shoes{
    @Override
    public void showLogo() {
        System.out.println("我是阿迪鞋子");
    }
}

//3.定义简单工厂方法类,使用一个静态工厂方法来根据不同的品牌条件来产生不同品牌的鞋
class SimpleFactory {
    public static Shoes makeShoes(String brand){
        Shoes shoes = null;
        switch (brand){
            case "nike":
                shoes = new NikeShoes();
                break;
            case "adidas":
                shoes = new AdidasShoes();
                break;
            default:
                System.out.println("错误的品牌");
        }
        return shoes;
    }
}

//使用简单工厂模式
public class SimpleFactoryExample{
    public static void main(String[] args) {
        //使用工厂模式创建耐克品牌的鞋子
        Shoes nikeShoes = SimpleFactory.makeShoes("nike");
        nikeShoes.showLogo();

        //使用工厂模式创建阿迪品牌的鞋子
        Shoes adidasShoes = SimpleFactory.makeShoes("adidas");
        adidasShoes.showLogo();
    }
}

******************【运行结果】******************
我是耐克鞋子
我是阿迪鞋子

可以看出,简单工厂模式的出现,使得我们通过传入不同的参数类型就可以创建不同类型的对象实例,将对象的构建过程完全交给了简单工厂方法类SimpleFactory。

简单工厂模式的缺点

简单工厂模式的缺点用一句话介绍就是:违反了开闭原则,(对扩展开放,对修改关闭),破坏其内聚性,给维护带来额外开支。这句话怎么理解了?我们还是举个例子吧。

还是上面这个业务场景,假设现在小明的生意越做越大了,又拓展了安踏这个品牌,那么针对新增加的品牌,需要做如下改动:

//改动1:新增加安踏品牌,需要新增加有一个安踏鞋类继承抽象基类
class 
AntaShoes extends Shoes{

    @Override
    public void showLogo() {
        System.out.println("我是安踏鞋子");
    }
}

//改动2:工厂方法类中方法增加一个创建安踏鞋子的分支
class SimpleFactory {
    public static Shoes makeShoes(String brand){
        Shoes shoes = null;
        switch (brand){
            case "nike":
                shoes = new NikeShoes();
                break;
            case "adidas":
                shoes = new AdidasShoes();
                break;
            case "anta":
                shoes = new AntaShoes();
                break;

            default:
                System.out.println("错误的品牌");
        }
        return shoes;
    }
}

可以看到,每当我们增加一种产品的时候就要去修改工厂方法。而不是扩展,这就是所谓的违反了开闭原则。为了克服简单工厂模式的缺点,工厂方法模式就被提了出来,我们下篇文章再介绍。

本文源码地址:
https://github.com/qinlizhong1/javaStudy/tree/master/DesignPattern/src/factory

本文示例代码环境:
操作系统:macOs 12.1
JDK版本:12.0.1
maven版本: 3.8.4

—  —

欢迎关注↓↓↓
发文不易,如有帮助,辛苦点赞和在看
浏览 22
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报