设计模式之工厂方法

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

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

三、代码举例:

设计模式之工厂方法

抽象汽车类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)

大家都在看

  • navicat~导出数据库密码

    当我们mysql密码忘记了,而在navicat里有记录,我们应该如何导出这个密码呢? 第一步:文件菜单,导出链接,导出连接获取到 connections.ncx 文件 这里需要勾选…

    数据库 2023年5月24日
    0182
  • MySQL高可用安装

    MySQL HA部署 环境准备 创建本地yum源 确认关闭 SELinux 防火墙设置 MySQL安装 使用 root 用户操作创建相关的用户组和用户 上传/解压介质 设置自启动 …

    数据库 2023年5月24日
    0110
  • 使用MobaXterm发布服务器项目文件

    注:笔记旨在记录 一、使用MobaXterm登录服务器 二、后端发布 三、前端发布 一、使用MobaXterm登录服务器 打开MobaXterm,点击左上角Session->…

    数据库 2023年6月16日
    0116
  • VM Ware 给Centos虚拟机配置静态IP

    前言:在大家的日常运维工作中,肯定多多少少都会用到虚拟机,但是默认情况下VMware创建的虚拟机每次启动都有可能更换IP这就对我们的工作造成了一定的麻烦,下面我就给大家介绍下,如何…

    数据库 2023年6月9日
    0103
  • 汇编语言学习记录一

    0x00——什么是汇编语言? 汇编语言:早期实现程序员和机器进行交互的汇编指令集。 汇编指令,通过编译器,转换成机器码,从而使 机器 理解其指令。 0x01——汇编语言的组成 汇编…

    数据库 2023年6月11日
    088
  • MySQL 回表

    MySQL 回表 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。 一、简述 回表,顾名思义就是回到表中,也就是先通过普通索引扫描出数据所在的行,再通过行主键ID 取出索引中未包含…

    数据库 2023年6月14日
    083
  • Isilon 的OneFs常见操作命令(一)

    1背景知识: Isilon的oneFS是基于Free BSD的,FreeBSD 是一种类UNIX操作系统,因此有些类似Linux操作系统的常见命令可以直接使用,但有些又略微差别,需…

    数据库 2023年6月14日
    0347
  • 中文技术文档写作规范

    使用 markdown 格式书写文档 只使用一二三级标题,三级标题下面的并列性内容使用列表展示 二级标题前使用行分隔符表示分隔 段落之间使用一个空行隔开 一句话或者以逗号分隔的句子…

    数据库 2023年6月6日
    087
  • 0812JDBC随笔

    1.Properties的load方法 Properties的load方法其实就是传进去一个输入流,字节流或者字符流,字节流利用InputStreamReader转化为字符流,然后…

    数据库 2023年6月14日
    088
  • 华为云操作记录——JavaWeb 环境搭建

    华为云操作记录 创建用户 新建用户 sudo adduser weirwei 添加免密 root 权限 sudo vim /etc/sudoers 添加 root 权限 sudo …

    数据库 2023年6月9日
    089
  • 做自动化测试选择Python还是Java?

    你好,我是测试蔡坨坨。 今天,我们来聊一聊测试人员想要进阶,想要做自动化测试,甚至测试开发,如何选择编程语言。 自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件…

    数据库 2023年6月11日
    0113
  • 567.字符串中的排列

    滑动窗口 给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。 换句话说,s1 的排列之一是 s2…

    数据库 2023年6月16日
    081
  • 双色球系统开发

    Java对彩票双色球系统开发的简单实现 双色球系统 案例: 中奖条件及奖金表 代码及解释 main方法代码: public static void main(String[] ar…

    数据库 2023年6月16日
    0125
  • Java 书城项目本地部署指引

    在数据库管理工具中新建数据库名固定为 bookstore,并初始化以下表及数据 /* Navicat Premium Data Transfer Source Server : l…

    数据库 2023年6月11日
    0109
  • SQL优化

    一、插入优化 批量插入 insert into tb_name values (1,"张三"),(2,"张三"),(3,"张三&q…

    数据库 2023年5月24日
    084
  • 解决PHP undefined function mcrypt_encrypt()的报错问题

    今天迁移服务器代码遇到了一个未定义的错误 查找了相关资料后,发现是缺少php_mcrypt扩展 于是去下载扩展: https://windows.php.net/downloads…

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