大白话简单工厂模式 (Simple Factory Pattern)

大白话简单工厂模式 (Simple Factory Pattern)

从买车经历说起

毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车。逛了多家4S店,最终定下日产某车型的轿车。4S店接受订单后,向工厂说明车型,工厂随后进行汽车制造,运输到4S店中再到了小两口的手上,小两口终于成了有车一族。
仔细分析,4S销售模式即为典型的简单工厂模式。下面从代码的角度进行分析。

无工厂模式

首先,我们先分析4S店最初的模式(企业个人作坊阶段,无工厂)。4S店卖车首先要有车,这里只取日产部分车型逍客,轩逸和天籁。

代码片段1 日产车父类,所有车型都继承此类。

/**
 * 日产车
 * @author coderzcr
 */
abstract class NissanCar {
    String name;
    void printCar(){
        System.out.println(name+"汽车已制造完成");
    }
}

代码片段2 车型:逍客

/**
 * 车型:逍客
 * @author coderzcr
 */
class Xtrail extends NissanCar {
    Xtrail(){
        this.name = "逍客";
    }
}

代码片段3 车型:轩逸

/**
 * 车型:轩逸
 * @author coderzcr
 */
class Sylphy extends NissanCar {
    Sylphy(){
        this.name = "轩逸";
    }
}

代码片段4 车型:天籁

/**
 * 车型:天籁
 * @author coderzcr
 */
class Altima extends NissanCar {
    Altima(){
        this.name="天籁";
    }
}

代码片段5 无工厂的4S店

/**
 * 4s店
 * @author coderzcr
 */
class FourS {
    /**
     * 获取汽车
     * @param type 汽车型号
     */
    void getCar(String type) {
        NissanCar nissanCar = null;
        if ("1".equals(type)) {
            nissanCar = new Xtrail();
        } else if ("2".equals(type)) {
            nissanCar = new Sylphy();
        } else if ("3".equals(type)) {
            nissanCar = new Altima();
        }
        assert nissanCar != null;
        nissanCar.printCar();
    }

}

图片1 无工厂模式类图
无工厂模式类图
由上图可以发现

  1. 4S店职责过多,不仅需要销售,还需要制造汽车,明白如何生产某型号的汽车。
  2. 耦合严重,如果需要发布新的车型,还需要对4S进行修改(即学习更多的车型制造),无疑增大了4S店的压力。

随着企业的发展,企业认识到了问题的严重性,开始设立工厂。工厂负责制造汽车,4S店负责销售汽车,只需告知工厂型号即可获取汽车。

代码片段6 汽车工厂

/**
 * 日产车工厂
 * @author coderzcr
 */
public class NissanCarFactory {
    /**
     * 生产汽车
     * @param type 汽车型号
     */
    NissanCar createCar(String type) {
        NissanCar nissanCar = null;
        if ("1".equals(type)) {
            nissanCar = new Xtrail();
        } else if ("2".equals(type)) {
            nissanCar = new Sylphy();
        } else if ("3".equals(type)) {
            nissanCar = new Altima();
        }
        return nissanCar;
    }
}

代码片段7 有工厂的4S店。

/**
 * 有工厂的4S店。
 *
 * @author coderzcr
 */
class FourS {

    NissanCarFactory nissanCarFactory;

    FourS(NissanCarFactory nissanCarFactory) {
        this.nissanCarFactory = nissanCarFactory;
    }

    /**
     * 获取汽车
     *
     * @param type 汽车型号
     */
    void getCar(String type) {
        NissanCar nissanCar =  nissanCarFactory.createCar(type);
        nissanCar.printCar();
    }
}

图片2 有工厂模式类图
有工厂模式类图

经过改造,4S店和工厂的职责进行了分离,减轻了4S店的压力。当发布新车型时,只需了解其型号告知工厂即可获取到相应车辆。

简单工厂模式定义

简单工厂模式(Simple Factory Pattern):属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

已上面举例来解释的话就是根据车型的不同制造不同型号的车。日产专门建造一个工厂来负责制造汽车,被创造的汽车都是日产车型。

简单工厂模式结构

简单工厂模式包含如下角色:

  • Factory:工厂角色
    工厂角色负责实现创建所有实例的内部逻辑。例子中得日产工厂(NissanFactory)
  • Product:抽象产品角色
    抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口。例子中的日车车(NissanCar)
  • ConcreteProduct:具体产品角色
    具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。例子中的逍客,轩逸,天籁。(Xtrail、Sylphy、Altima)

图片3 简单工厂模式
简单工厂模式类图

简单工厂模式分析

将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。

简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的

简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节

参考文献

1. 简单工厂模式( Simple Factory Pattern ) — Graphic Design Patterns

### Django MTV模式详解 Django 是一个基于 Python 的高级 Web 框架,采用了经典的 **MTV(Model-Template-View)** 设计模式。以下是对其核心组成部分的详细说明: #### 1. Model(模型) 模型是数据的核心表示形式,主要负责与数据库交互。它是应用程序的数据层,定义了如何存储、检索和更新数据[^1]。 在 Django 中,模型是一个 Python 类,继承自 `django.db.models.Model`,并通过字段属性描述表结构。例如: ```python from django.db import models class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) ``` 这段代码定义了一个名为 `Article` 的模型,对应数据库中的表格,包含三个字段:标题 (`title`)、内容 (`content`) 和创建时间 (`created_at`)。 --- #### 2. Template(模板) 模板是 HTML 文件,用于展示数据给用户。它是一种前端表现形式,允许嵌入动态变量和逻辑控制语句[^2]。 Django 提供了一套强大的模板引擎,支持条件判断、循环以及其他常用语法。例如: ```html <!DOCTYPE html> <html> <head> <title>{{ article.title }}</title> </head> <body> <h1>{{ article.title }}</h1> <p>{{ article.content }}</p> </body> </html> ``` 在这个例子中,`{{ article.title }}` 和 `{{ article.content }}` 是占位符,会被实际数据替换。 --- #### 3. View(视图) 视图是连接模型和模板的关键组件,负责处理用户的请求并返回响应。它充当控制器的角色,决定显示什么内容以及如何显示[^3]。 视图通常是 Python 函数或类,接收 `HttpRequest` 对象作为输入,并返回 `HttpResponse` 或渲染后的模板。例如: ```python from django.shortcuts import render from .models import Article def article_detail(request, id): article = Article.objects.get(id=id) return render(request, 'article.html', {'article': article}) ``` 此代码片段展示了如何查询指定 ID 的文章,并将结果传递给模板进行渲染。 --- ### 总结 MTV 模式的本质在于分离关注点,使开发人员能够专注于各自的任务而不互相干扰。模型管理数据,模板负责呈现界面,视图协调两者之间的关系[^4]。这种分层架构提高了代码的可维护性和扩展性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值