设计模式之工厂方法

一、工厂方法:简单工厂违背了单一职责原则,而且不利于扩展,于是衍生了工厂方法模式,该模式能很好地解决对扩展开放、对修改关闭的需求。

二、实现思路 :对每一个对象都创建一个对应的工厂类,对对象和工厂类都进行抽象,让上端尽量依赖抽象。

三、代码举例:

设计模式之工厂方法

抽象汽车类Car:

csharp;collapse:true;;gutter:true; namespace FactoryMethod { public abstract class Car { public abstract void Drive(); } }</p> <pre><code> 抽象工厂类Factory: ;collapse:true;;gutter:true;
namespace FactoryMethod
{
public interface Factory
{
Car CreateInstance();
}
}

奔驰汽车类BenChiCar:

csharp;collapse:true;;gutter:true; namespace FactoryMethod { public class BenChiCar:Car { public override void Drive() { Console.WriteLine("奔驰汽车行驶中!"); } } }</p> <pre><code> 宝马汽车类BaomaCar: ;collapse:true;;gutter:true;
namespace FactoryMethod
{
public class BaomaCar : Car
{
public override void Drive()
{
Console.WriteLine("宝马汽车行驶中!");
}
}
}

大众汽车类DazongCar:

csharp;collapse:true;;gutter:true; namespace FactoryMethod { public class DazongCar:Car { public override void Drive() { Console.WriteLine("大众汽车行驶中!"); } } }</p> <pre><code> 奔驰汽车工厂类BenChiFactory: ;collapse:true;;gutter:true;
namespace FactoryMethod
{
public class BenChiFactory : Factory
{
public Car CreateInstance()
{
Console.WriteLine("创建了奔驰汽车!");
return new BenChiCar();
}
}
}

宝马汽车工厂类BaomaFactory:

csharp;collapse:true;;gutter:true; namespace FactoryMethod { public class BaomaFactory : Factory { public Car CreateInstance() { Console.WriteLine("创建了宝马汽车!"); return new BaomaCar(); } } }</p> <pre><code> 大众汽车工厂类DazongFactory: ;collapse:true;;gutter:true;
namespace FactoryMethod
{
public class DazongFactory : Factory
{
public Car CreateInstance()
{
Console.WriteLine("创建了大众汽车!");
return new DazongCar();
}
}
}

客户类:

csharp;collapse:true;;gutter:true;
{
//工厂方法,一个对象对应一个工厂,之所以这么做,是为了将对象的创建逻转移给工厂类(对象的创建有可能很复杂,这样做减少了客户端对创建对象所需的资源的依赖),而且新增对象时不需要修改原来的类,只需增加对象和创建对象的工厂即可,遵循了对扩展开放,对修改关闭的原则。
FactoryMethod.Factory Dazongfac = new FactoryMethod.DazongFactory();
Car Dazong = Dazongfac.CreateInstance();
Dazong.Drive();
FactoryMethod.Factory Benchifac = new FactoryMethod.BenChiFactory();
Car Benchi = Benchifac.CreateInstance();
Benchi.Drive();
FactoryMethod.Factory Baomafac = new FactoryMethod.BaomaFactory();
Car Baoma = Baomafac.CreateInstance();
Baoma.Drive();
Console.ReadKey();
}

运行结果:

设计模式之工厂方法

四、工厂方法的优缺点及应用:把对象创建的逻辑细节交给了工厂类,上端不需要关心创建对象需要的业务逻辑信息,但是增加了代码的复杂度 ;比起简单工厂能更好的进行扩展,需要增加对象时只需要增加一个对象和创建对象的工厂即可,不用修改原来的类,遵循了开闭原则,适用于创建复杂的对象,简单对象的创建没必要使用工厂方法模式。

Original: https://www.cnblogs.com/zqhIndex/p/10280134.html
Author: 我若安好,便是晴天
Title: 设计模式之工厂方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612896/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 关系型、非关系型数据库存储选型盘点大全

    工作中总是遇到数据存储相关的 Bug 工单,新需求开发设计中也多多少少会有数据模型设计和存储相关的问题。经过几次存储方案设计选型和讨论后发现需要有更全面的思考框架。 日常开发中常用…

    数据库 2023年6月14日
    0117
  • 如何成为一名开发人员——第 3 部分:人际交往能力

    在前两节中,我介绍了技术和非技术技能。但是,编程生涯不能凭空出现!需要彼此才能茁壮成长。 你听说过”铁磨铁”这句话。这在软件开发行业当然是正确的。我的大部分…

    数据库 2023年6月14日
    074
  • Nginx 反向代理、Rewrite

    Rewrite功能配置 Rewrite是Nginx服务器提供的一个重要基本功能,是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。www.jd.com注意:Ng…

    数据库 2023年6月6日
    076
  • zabbix 报表动作日志 报错”503“

    本文来自博客园,作者:xiao智,转载请注明原文链接:https://www.cnblogs.com/yuwen01/p/16216868.html Original: https…

    数据库 2023年6月14日
    076
  • centos下安装myrocksdb

    承接上一篇,https://www.cnblogs.com/lunyu/p/10190364.html 。编译安装myrocks的整个过程,特别是第2步和第7步,让人冗长难耐。因此…

    数据库 2023年6月14日
    0105
  • HMX-Server-分步式服务器框架(开源+源码)

    (原文地址:http://www.cnblogs.com/hellohuang/p/5492302.html ) 这是一个简单实现有分步式框架,由5个服务进程组成一个服务器,它们分…

    数据库 2023年6月14日
    0107
  • day04-2发送文件

    多用户即时通讯系统04 4.编码实现03 4.6功能实现-发送文件功能实现 4.6.1思路分析 客户端(发送者): 先把文件a.jpg读取到客户端的字节数组 把文件对应的字节数组封…

    数据库 2023年6月11日
    072
  • mysql8使用tmpfs内存磁盘当内存数据库的配置方法

    内存关系数据库没有找到开源好用的,很多都是商用。虽然mysql有memory引擎,但写是整体锁表,没法用。 一直想将mysql放入内存中,搜索n次资料,没找到合适的,可能之前思路不…

    数据库 2023年5月24日
    096
  • linux系统安装MySQL数据库安装保姆级教程及1045错误和2058问题解决

    使用Mysql的zip压缩包解压版,下载之后需进行一定的配置,才能使用它。下面对Mysql压缩包版的安装方法进行详细的描述,如有疑问或错误,望及时反馈。 首先,mysql的官方下载…

    数据库 2023年6月11日
    079
  • 最新Spring Boot 跨域配置,亲测好用

    背景: 网上有很多跨域配置,但都存在各种各样问题;经过改良和测试后,最终形成一个稳定配置版本,我的Spring Boot版本是2.5.1 问题: 前后端分离后,进行联调,发现浏览器…

    数据库 2023年6月6日
    095
  • 常见的限流算法

    通过限制并发访问数或者限制一个时间窗口内允许处理的请求数量来保护系统,例如,通过限流,你可以过滤掉产生流量峰值的客户和服务。 令牌桶算法 令牌桶算法是常见的一种限流算法。假设有一个…

    数据库 2023年6月16日
    073
  • Python 学习笔记(五)

    我们经常需要从文件中读取数据或向其中写入数据,但要做到这一点,我们需要检查文件是否存在。 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上…

    数据库 2023年6月16日
    075
  • spring内嵌cglib包,这里藏着一个大坑

    问题发现 2022-01-21 早上 9 点,订单系统出现大面积的”系统未知错误”报错,导致部分用户无法正常下单。查询后台日志,可以看到大量的 duplic…

    数据库 2023年6月6日
    0101
  • MySQL约束

    约束指对字段的约束,用于确保数据库的数据满足特定的规则。在MySQL中,数据库的约束包括, NOT NULL,PRIMARY KEY,UNIQUE,FOREIGN KEY,CHEC…

    数据库 2023年6月16日
    057
  • mysqlCRUD

    &#x67E5;&#x8BE2;&#x4E00;&#x4E2A;&#x6BB5;&#x91CC;&#x6240;&#…

    数据库 2023年6月9日
    065
  • 用相对定位实现简单的图片边框阴影效果

    实现阴影效果方法有很多,一般复杂一点的外发光式的阴影都使用png作为背景图片来实现阴影,今天做的这个比较简单,阴影是纯色的,所以可以直接使用背景颜色,图片的位移一下就能使图片产生阴…

    数据库 2023年6月11日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球