设计模式~工厂模式-03

简介: 工厂模式简单工厂模式优点:缺点:工厂方法模式

工厂模式

简单工厂模式

优点:

缺点:

工厂方法模式

优点:

缺点:

简单工厂模式和工厂方法模式对比

       任何可以产生对象的方法或类,都称之为工厂。

       工厂模式是一种非常常用的创建型设计模式,其提供了创建对象的最佳方式。在创建对象时,不会对客户端暴露对象的创建逻辑,而是通过使用共同的接口来创建对象。

       【追"美女"少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是"美女"爱吃的东西,虽然口味有所不同,但不管你带"美女"去麦当劳或肯德基,只管向服务员说「来四个鸡翅」就行了。麦当劳和肯德基就是生产鸡翅的Factory工厂模式:客户类和工厂类分开。

       消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。】

简单工厂模式

       简单工厂模式本身是违背开闭原则的,虽可通过反射+配置文件解决,但总体来说不友好。

       简单工厂模式代码简单,虽有多处if分支且违背开闭原则,但扩展性和可读性尚可,这样的代码在大多数情况下并无问题。

优点

       调用者想创建一个对象,只需要知道其名称即可。

缺点

       违背开闭原则,每增加一个对象都需要修改工厂类。

       【开闭原则(Open Closed Principle)是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的、灵活的系统。

       定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

       开闭原则的含义是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有代码来实现变化。】

工厂方法模式

       简单工厂模式违背了开闭原则,而工厂方法模式则是简单工厂模式的进一步深化,其不像简单工厂模式通过一个工厂来完成所有对象的创建,而是通过不同的工厂来创建不同的对象,每个对象有对应的工厂创建

优点

       (1)调用者想创建一个对象,只需要知道其名称即可。(2)扩展性高,如果增加一个类,只需要扩展一个工厂类。(3)对调用者屏蔽对象具体实现,调用者只需要关注接口。

缺点

       当增加一个具体类时,需要增加其对应的工厂类,在一定程度上增加了系统的复杂度。

简单工厂模式和工厂方法模式对比

       当对象的创建过程比较复杂,需要组合其他类对象做各种初始化操作时,推荐使用工厂方法模式,将复杂的创建逻辑拆分到多个工厂类中使得每个工厂类不过于复杂。而使用简单工厂模式则会将所有的创建逻辑都放到一个工厂类,会导致工厂类过于复杂。

/**
 * 接口
 */
public interface Moveable {
    void go();
}
/**
 * 继承Moveable
 */
public class Car implements  Moveable {
    public void go() {
        System.out.println("Car go wuwuwuwuw....");
    }
}
public class Broom implements Moveable{
    @Override
    public void go() {
        System.out.println("broom flying chuachuachua .....");
    }
}
/**
 * 简单工厂的可扩展性不好
 */
public class SimpleVehicleFactory {
    public Car createCar() {
        //before processing
        return new Car();
    }
    public Broom createBroom() {
        return new Broom();
    }
}
/**
 * 工厂方法
 */
public class CarFactory {
    public Moveable create() {
        System.out.println("a car created!");
        return new Car();
    }
}
public class Main {
    public static void main(String[] args) {
        //单列,任意定制生产过程
        Moveable m = new CarFactory().create();//工厂方法CarFactory
        m.go();
    }
}


目录
相关文章
|
JSON 自然语言处理 编译器
Alibaba.com瘦包40MB——业界最全的iOS包大小技术总结
前言包大小是衡量APP性能的一项重要指标,它直接影响用户的下载点击率(包太大不想下)、下载安装成功率(下载慢不用了)、APP卸载率(太占空间先删掉)。包大小的计算逻辑很简单,它是各种类型的文件占用磁盘大小相加。APP瘦身的技术却很复杂,代码文件的复杂度和编译器策略决定了可执行文件的大小,业务功能和工程架构决定了代码文件的复杂度。iOS APP瘦身,需要掌握的技能有XCode构建技术、LLVM编译器
4393 0
Alibaba.com瘦包40MB——业界最全的iOS包大小技术总结
|
11月前
|
缓存 Java API
基于Spring Boot REST API设计指南
【10月更文挑战第11天】 在构建现代Web应用程序时,RESTful API已成为一种标准,使得不同的应用程序能够通过HTTP协议进行通信,实现资源的创建、读取、更新和删除等操作。Spring Boot作为一个功能强大的框架,能够轻松创建RESTful API。本文将详细介绍如何在Spring Boot中设计和实现高质量的RESTful API。
353 61
BackTrader 中文文档(一)(4)
BackTrader 中文文档(一)
166 0
|
Kubernetes API 开发工具
在K8S中,Deployment的升级过程是什么?
在K8S中,Deployment的升级过程是什么?
|
JSON 定位技术 数据格式
GeoJSON区县级地理数据信息拼接使用说明
GeoJSON区县级地理数据信息拼接使用说明
916 0
|
前端开发 Java
后端BUG系列之:SpringBoot上传文件太大 报错 Maximum upload size exceeded
这篇文章讨论了SpringBoot应用中上传文件过大导致的错误"Maximum upload size exceeded",并提供了通过修改`application.properties`文件中的上传限制配置来解决这个问题的方法。
|
IDE Java 开发工具
Spring Boot DevTools:加速开发的热部署工具
【4月更文挑战第28天】在Spring Boot的开发过程中,快速反馈和效率至关重要。Spring Boot DevTools是一个为开发者设计的模块,支持热部署(hot swapping),能够实现应用的快速重启和自动重载,极大地提高了开发效率。本篇博客将介绍Spring Boot DevTools的核心概念,并通过具体的实战示例展示如何在开发过程中利用这一工具。
291 0
|
JavaScript 算法
使用 THREE.js 进行边界体积碰撞检测
本文介绍如何使用 Three.js 库在边界框和球体之间实现冲突检测。假设在阅读本文之前,您已经先阅读了我们的 3D 碰撞检测介绍性文章,并了解了 Three.js 的基本知识。
482 0
|
搜索推荐
五款好用又有趣的WIN10软件推荐
如果你想让你的电脑使用更方便、更有趣、更专业,那么你一定要看看这篇文章,因为我要给你推荐五款好用又有趣的WIN10软件
374 1
五款好用又有趣的WIN10软件推荐