首页 > 其他分享 >2、工厂模式

2、工厂模式

时间:2024-10-21 16:45:55浏览次数:5  
标签:IAnimal return class 模式 工厂 CreateAnimalInstance new public

一、简单工厂模式

在一个工厂类中暴露一个带参数的方法,根据方法参数实例化所需要的对象,由于工厂中包含了判断逻辑,不符合(OCP),只适应于简单固定的几个对象,后期新增对象,需要修改工厂方法

public static class SimpleFactory
{
	public static IAnimal CreateAnimalInstance(EAnimalType eAnimalType)
	{
		return eAnimalType switch
		{
			EAnimalType.Bird => new Bird(),
			EAnimalType.Dog => new Dog(),
			_ => throw new NotImplementedException(),
		};
	}
}

public enum EAnimalType
{
	Bird,
	Dog
}

public interface IAnimal
{
	string Name { get; }
	void Eah();
}

public class Bird : IAnimal
{
	public String Name => throw new NotImplementedException();

	public void Eah()
	{
		throw new NotImplementedException();
	}
}

public class Dog : IAnimal
{
	public String Name => throw new NotImplementedException();

	public void Eah()
	{
		throw new NotImplementedException();
	}
}

 

二、反射模式,这是基本简单模式的优化,根据需要创建的实例全名通过反射创建实例,这样去掉了简单模式中的逻辑判断,从而遵循了OCP原则

public static class ReflectFactory
{
    public static IAnimal? CreateAnimalInstance(string typeName)
    {
        var typeInfo = Type.GetType(typeName,true,true);
        return typeInfo?.Assembly.CreateInstance(typeName, true) as IAnimal;
    }
}

三、方法模式,每一个产品设计一个工厂接口,同类的产品实例实现自己的工厂,客户端使用时,实例化不同的工厂,实际也是简单工厂的优化,把判断逻辑提供给客户端,由具体工厂解耦实例对象

interface IMethodFactory
{
    IAnimal CreateAnimalInstance();
}

public class BirdFactory : IMethodFactory
{
    public IAnimal CreateAnimalInstance()
    {
        return new Bird();
    }
}

public class DogFactory : IMethodFactory
{
    public IAnimal CreateAnimalInstance()
    {
        return new Dog();
    }
}

四、抽象模式,抽象模式或以说是多个方法模式工厂的聚合

interface IAbstractFactory
{
    IAnimal CreateAnimalInstance();
    IPlant CreatePlantInstance();

}

public class AbstractFactoryA : IAbstractFactory
{
    public IAnimal CreateAnimalInstance()
    {
        return new Bird();
    }

    IPlant IAbstractFactory.CreatePlantInstance()
    {
        return new PlantA();
    }
}

public class AbstractFactoryB : IAbstractFactory
{
    public IAnimal CreateAnimalInstance()
    {
        return new Dog();
    }

    IPlant IAbstractFactory.CreatePlantInstance()
    {
        return new PlantB();
    }
}

 

标签:IAnimal,return,class,模式,工厂,CreateAnimalInstance,new,public
From: https://www.cnblogs.com/ljx2012/p/18489785

相关文章

  • Docker 的网络模式 + 容器间通讯 + TC 流量控制工具
    写在前面:        近期在忙一个两端通讯的任务,想用一定的流量控制工具来模拟不同网络下的运行情况。这里记录下学到的内容。主要包含Docker的网络配置情况和容器间通讯以及限速工具TC的介绍。一、TrafficControl工具引入TC(TrafficControl)是Linux系统中的流量......
  • Docker五种网络模式
    Bridge(桥接模式)---默认模式解释:Bridge模式是Docker的默认网络配置。每个使用此模式的容器都会得到一个独立的NetworkNamespace,Docker会为容器分配一个内部IP地址,并将其连接到一个名为docker0的虚拟网桥上。这意味着容器间可以相互通信,同时也能够通过宿主机的网络栈访问外部......
  • 群控系统服务端开发模式-功能整理
    去向管理列表编号、去向名称、官网地址、数据状态、创建时间、修改时间添加去向名称、官网地址、数据状态编辑去向名称、官网地址、数据状态保存详情唯一编号、去向名称、官网地址、数据状态、创建时间、修改时间启禁用删除会员管理列表编号、去向名称、账号、密码、会......
  • PHP cli模式和fpm模式有什么区别
    PHP的CLI模式与FPM模式主要的区别包括:它们的运行环境不同、使用场景不同、性能表现不同、配置方式不同。在深入了解两者之间的区别之前,我们首先必须了解CLI(命令行界面)和FPM(FastCGI进程管理器)的基本概念。CLI模式是专门为命令行脚本执行设计的,并在不与Web服务器集成的情况下运行......
  • Django的MVT设计模式
    经典的MVC设计模式及其有点MVC即Model-View-Controller(模型-视图-控制器),是经典的软件开发设计模式***Model(模型)**简而言之即数据模型。模型不是数据本身(比如数据库里的数据),而是抽象的描述数据的构成和逻辑关系。通常模型包括了数据表的各个字段(比如人的年龄和出生日期......
  • 基智科技 CEO 张文战:探索火山引擎数据飞轮模式下的大模型应用新机会
    9月下旬,火山引擎数据飞轮研讨会在北京举办,北京基智科技有限公司(以下简称“基智科技”)CEO张文战作为积极探索大模型应用领域的企业代表,围绕“数据飞轮如何转进企业业务流”展开主题分享,并介绍基智科技在大模型领域见证的新变化和为企业提供的新方案。 成立于2014年的基智科技是......
  • 面向对象与设计模式第一课:深入理解OOP
    第三章:面向对象与设计模式第一课:深入理解OOP面向对象编程(OOP)是一种编程范式,它将程序结构视为由对象组成,促进了代码的重用性和可维护性。在这一课中,我们将深入分析OOP的四个基本特性:封装、继承、多态和抽象,并提供相应的示例与实践。1.OOP基本特性1.1封装封装是OOP的核心......
  • 源计划智能工厂MES系统(开源版)
    在gitee中找到了一个mes系统,这个系统有详细的部署教程,但是我还是遇到了很多问题下面是自己将其部署到本地的经历  yjh-mes:源计划MES,后端服务+后台前端界面(gitee.com)首先是node版本不对应,而且我没有下载nvm管理node所以要将node删除后下载nvm。首先在控制面板删除node......
  • PHP 正则表达式 修正符【m s x e ? (?i)】内部修正符 贪婪模式 后向引用 断言【总结篇
    1.正则表达式修正符在PHP中,正则表达式中的修正符(modifier)可以改变模式的行为,使得其功能更加灵活。1.m修正符(多行模式)作用:在多行模式下,^和$元字符除了匹配整个字符串的开头和结尾外,还可以匹配每一行的开头和结尾。举例: "Hello\nWorld",当使用/^World/m时,^会匹配"W......
  • QT 用UI设计界面编写电脑同款计算机标准模式
    成果如下:应学校老师要求,已经实现基础的计算,显示历史记录,语言播放数字的功能。mainwindow.h文件#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QVector>#include<QMainWindow>#include<QString>#include<QFile>#include"fileshow.h"#include"ui_f......