当前位置: 首页 > news >正文

创建型模式-工厂方法模式(二)

目录

工厂方法模式描述

工厂方法模式存在的问题

解决方案

使用场景

优缺点对比

代码


工厂方法模式描述

工厂方法模式,是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

工厂方法模式存在的问题

如果你老板,开发了一款出售灯饰的系统,最初设计的是只有一种灯,蓝色的灯,然后你把大部分的代码都写在了蓝灯类中,一段时间后,你的货物销量非常好,而且销售到了海外,海外客户希望你能出售红灯的产品,这对于公司来说,非常有利。但是此时的代码已经全部写在蓝灯类里面了,你是在蓝灯类里面,增加红灯的逻辑吗?这样修改量太大了,如果以后增加绿灯怎么办呢?

解决方案

工厂方法模式建议使用特殊的工厂方法代替对于对象构造函数的直接调用(即使用 new运算符)。 不用担心,对象仍将通过new运算符创建,只是该运算符改在工厂方法中调用罢了。 工厂方法返回的对象通常被称作 “产品”。

使用场景

1.当你在编写代码的过程中,如果无法预知对象确切类别及其依赖关系时,可使用工厂方法。

2.如果你希望用户能扩展你软件库或框架的内部组件,可使用工厂方法。

3.如果你希望复用现有对象来节省系统资源, 而不是每次都重新创建对象,可使用工厂方法。

优缺点对比

优点缺点
你可以避免创建者和具体产品之间的紧密耦合应用工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。 最好的情况是将该模式引入创建者类的现有层次结构中
单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护
开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型

其中简单工厂模式属于工厂模式,工厂模式保持了简单工厂模式的优点,而且克服了它的缺点。

图示表达

看起来很麻烦,其实记忆起来非常的简单。首先分2部分,抽象工厂和具体工厂,然后有几个抽象产品就有几个具体产品,他们是一 一对应的关系

代码

1.建立一个控制台程序,代码文件总览。可见上面说的缺点,就体现出来了,写了很多的子类,如果分不清结构,将是灾难性的代码。

2.抽象产品,Light类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    public abstract class Light    //建立抽象产品, abstract,不能实例化
    {
        public abstract void TurnOn();      //抽象产品有打开的方法,abstract,不能实现
        public abstract void TurnOff();     //抽象产品有关闭的方法,abstract,不能实现
    }
}

3.具体产品,BulbLight类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    public class BulbLight : Light       //灯泡的光,建立具体的产品,继承灯泡
    {
        public override void TurnOff()//实现灯泡的功能,override重写继承的方法
        {
            Console.WriteLine("关闭");
        }

        public override void TurnOn() //实现灯泡的功能,override重写继承的方法
        {
            Console.WriteLine("打开");
        }
    }
}

4.具体产品,TubeLight类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    public class TubeLight : Light      //灯的灯管,建立具体的产品,继承灯泡 
    {
        public override void TurnOff()  //实现灯泡的功能,override重写继承的方法
        {
            Console.WriteLine("关闭");
        }

        public override void TurnOn()    //实现灯泡的功能,override重写继承的方法  
        {
            Console.WriteLine("打开");
        }
    }
}

5.抽象工厂,Creator类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    public abstract class Creator     //建立抽象工厂, abstract,不能实例化
    {
        public abstract Light factory();      //建立Light产品抽象类,默认方法factory
    }
}

6.具体工厂,BulbCreator类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    public class BulbCreator : Creator //制造灯光的厂,具体工厂,继承工厂
    {
        public override Light factory()   //重写工厂的方法
        {
            return new BulbLight();    //返回制造灯泡的光
        }
    }
}

7.具体工厂,TubeCreator类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    public class TubeCreator : Creator //制造灯管的厂,具体工厂,继承工厂
    {
        public override Light factory()       //重写工厂的方法
        {
            return new TubeLight();        //返回制造灯管
        }
    }
}

8.使用

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            Creator c1 = new BulbCreator();
            Creator c2 = new TubeCreator();
            Light l1 = c1.factory();
            Light l2 = c2.factory();
            l1.TurnOn();
            l1.TurnOff();
            new BulbCreator().factory().TurnOn();
            Console.WriteLine("-----------------");
            l2.TurnOn();
            l2.TurnOff();
            new TubeCreator().factory().TurnOn();
            Console.WriteLine("结束");
        }
    }
}

9.效果

相关文章:

  • 面试的时候要注意的坑
  • 虹科案例 | 虹科HiveMQ助力实现百万辆汽车智能互联
  • Nginx基础篇-Nginx的WEB模块~连接状态
  • 营收、利润双增长,龙湖集团找到多元增长的答案?
  • YOLO系列之yolov1解读(1)
  • Softing IT Networks线上研讨会 | 9月 (下篇)
  • HBase原理深入
  • webpack5 之 基础构建打包
  • STM32使用寄存器点灯实验
  • 技术对接35
  • 金仓数据库 KingbaseES 插件参考手册 plsql_pldbgapi
  • 测试面试 | 某 BAT 大厂测试开发面试真题与重点解析
  • 2022鹏城杯
  • Kubernetes学习笔记-保障集群内节点和网络安全(3)限制pod使用安全相关的特性20220828
  • [免费专栏] Android安全之利用ADT获取内存中的敏感信息
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • CentOS从零开始部署Nodejs项目
  • ES6系列(二)变量的解构赋值
  • JSDuck 与 AngularJS 融合技巧
  • mockjs让前端开发独立于后端
  • Odoo domain写法及运用
  • Otto开发初探——微服务依赖管理新利器
  • PAT A1050
  • QQ浏览器x5内核的兼容性问题
  • React-redux的原理以及使用
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Zsh 开发指南(第十四篇 文件读写)
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 使用Swoole加速Laravel(正式环境中)
  • 通过几道题目学习二叉搜索树
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​ubuntu下安装kvm虚拟机
  • #pragma multi_compile #pragma shader_feature
  • #QT(串口助手-界面)
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (windows2012共享文件夹和防火墙设置
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (算法二)滑动窗口
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)ORM
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .cn根服务器被攻击之后
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net程序集学习心得