简易的工厂设计模式

简易,工厂,设计模式 · 浏览次数 : 305

小编点评

**工厂模式**是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需暴露对象的创建逻辑。 **工厂方法模式**使类的实例化延迟到其子类。 **C#工厂模式示例** ```csharp public interface IAnimal { void Speak(); } public class Dog : IAnimal { public void Speak() { Console.WriteLine("狗说:汪,汪"); } } public class Cat : IAnimal { public void Speak() { Console.WriteLine("猫说:喵。"); } } public class AnimalFactory { public IAnimal GetAnimal(string animalType) { switch (animalType.ToLower()) { case "dog": return new Dog(); case "cat": return new Cat(); default: throw new ArgumentException("无效动物型"); } } } public class Client { private IFactory factory; public Client(IFactory factory) { this.factory = factory; } public void UseProduct() { IAnimal product = factory.GetAnimal("dog"); product.Speak(); } } ``` **使用示例** ```csharp // 创建工厂 AnimalFactory animalFactory = new AnimalFactory(); // 创建产品 IAnimal dog = animalFactory.GetAnimal("dog"); // 使用产品 dog.Speak(); // 创建另一个产品 IAnimal cat = animalFactory.GetAnimal("cat"); // 使用另一个产品 cat.Speak(); ``` **输出** ``` 狗说:汪,汪 猫说:喵。 ```

正文

工厂设计模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需暴露对象的创建逻辑。在工厂模式中,我们定义一个接口或抽象类,该接口或抽象类用于创建对象,但让子类决定要实例化的类。工厂方法模式使类的实例化延迟到其子类。

下面是一个完整的C#实现案例:

首先,我们定义一个接口,用于创建对象:

public interface IAnimal
{
    void Speak();
}

然后,我们定义两个实现该接口的类:

public class Dog : IAnimal
{
    public void Speak()
    {
        Console.WriteLine("狗说:汪,汪");
    }
}

public class Cat : IAnimal
{
    public void Speak()
    {
        Console.WriteLine("猫说:喵。");
    }
}

接下来,我们定义一个工厂类,该类根据传入的参数创建相应的对象:

public class AnimalFactory
{
    public IAnimal GetAnimal(string animalType)
    {
        switch (animalType.ToLower())
        {
            case "dog":
                return new Dog();
            case "cat":
                return new Cat();
            default:
                throw new ArgumentException("无效动物型");
        }
    }
}

最后,我们可以使用工厂类来创建对象:

AnimalFactory animalFactory = new AnimalFactory();

IAnimal dog = animalFactory.GetAnimal("dog");
dog.Speak(); // 输出:狗说:汪汪

IAnimal cat = animalFactory.GetAnimal("cat");
cat.Speak(); // 输出:猫说:喵

在这个例子中,我们使用工厂类来创建不同类型的动物对象,而不需要暴露对象的创建逻辑。这使得我们可以轻松地添加新的动物类型,而不需要修改现有的代码。

以下是一个抽象工厂的C#示例:

// 抽象产品接口
public interface IProduct
{
    void Use();
}

// 具体产品A
public class ProductA : IProduct
{
    public void Use()
    {
        Console.WriteLine("使用产品A");
    }
}

// 具体产品B
public class ProductB : IProduct
{
    public void Use()
    {
        Console.WriteLine("使用产品B");
    }
}

// 抽象工厂接口
public interface IFactory
{
    IProduct CreateProduct();
}

// 具体工厂A
public class FactoryA : IFactory
{
    public IProduct CreateProduct()
    {
        return new ProductA();
    }
}

// 具体工厂B
public class FactoryB : IFactory
{
    public IProduct CreateProduct()
    {
        return new ProductB();
    }
}

// 客户端代码
public class Client
{
    private IFactory factory;

    public Client(IFactory factory)
    {
        this.factory = factory;
    }

    public void UseProduct()
    {
        IProduct product = factory.CreateProduct();
        product.Use();
    }
}

// 使用示例
Client clientA = new Client(new FactoryA());
clientA.UseProduct(); // 输出:使用产品A

Client clientB = new Client(new FactoryB());
clientB.UseProduct(); // 输出:使用产品B

在这个示例中,抽象工厂接口 IFactory 定义了一个 CreateProduct 方法,用于创建产品。具体工厂 FactoryAFactoryB 实现了 IFactory 接口,并分别创建了具体产品 ProductAProductB。客户端代码 Client 接收一个工厂对象,并使用工厂对象创建产品并使用。这样,客户端代码就可以通过更换工厂对象来创建不同的产品。

与简易的工厂设计模式相似的内容:

简易的工厂设计模式

工厂设计模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需暴露对象的创建逻辑。在工厂模式中,我们定义一个接口或抽象类,该接口或抽象类用于创建对象,但让子类决定要实例化的类。工厂方法模式使类的实例化延迟到其子类。 下面是一个完整的C#实现案例: 首先,我们定义一个接口,用于创建对象: p

oidc-client.js踩坑吐槽贴

前言 前面选用了IdentityServer4做为认证授权的基础框架,感兴趣的可以看上篇<微服务下认证授权框架的探讨>,已经初步完成了authorization-code与implicit的简易demo(html+js 在IIS部署的站点),并实现了SSO,本想着将Demo迁移到vue工程是轻而易举

Nodejs 应用编译构建提速建议

前端构建的提速是一项比较复杂且细节的工程, 目前产品上在持续跟踪构建慢的应用, 努力优化编译速度, 但前端本身拥有一个比较自由的技术环境, 没有统一的构建工具与流程, 另外语言本身的执行效率、单线程的构建也不好让编译机发挥其最大能力, 所以目前全局的通用优化手段还是会比较局限, 还是依赖项目自身的优化. 希望大家一起努力共建美好的明天.

关于 IDP 的五大认知误解

内部开发者平台(IDP)是近年来在希望加快软件交付和改善开发者体验的企业中得到普及的一个概念。然而,大众对于什么是 IDP 以及它能为开发者和企业带来什么也有很多困惑和误解。在这篇文章中,我们将尝试解开一些关于平台工程以及 IDP 的常见误解,以及关于企业该如何避免进入这些误区给出一些建议。 关于

使用VPN【wireguard】搭建安全,方便的跳板机【0到1架构系列】

什么是跳板机? 部署一台具有公网通讯能力的服务器,开发或运维通过这台服务器的远程登陆功能,远程登陆该服务器然后与处于内网的服务器进行通讯或作业,那么这台服务器一般称为"跳板机"。 跳板机的安全 一般来说不建议在搭建公网服务的服务器上面暴露远程登陆端口,因为公网IP己经暴露,部署专门用于登陆的跳板机可

devops|中小公司效率为王,没必要度量

之前写过一篇文章《devops|中小公司不要做研发效能度量》,主要是从基础设施方向考虑,因为很多条件都不具备,贸然高投入去做研发效能度量可能达不到我们的预期效果,给出的建议是先做好当下打好基础。今天想到一个好例子,可以类比下。 两个人小家庭 1)人少 2)收入清晰 3)支出清晰,买了什么东西,花了多

[转帖]使用Linux命令快速查看某一行

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 当年,我还是Linux菜鸟的时候,就在简历上写着精通Linux命令了,而当面试官问我“如何快速查看某个文件的第200行,仅这一行”时,我的心里是懵逼的。 当时面试官心里估计在窃喜,从我敷衍的回答中,他应该已经完全

.NET周报【1月第4期 2023-01-28】

由于微信公众号排版问题,建议大家在PC端浏览。 国内文章 C# 很少人知道的科技 https://blog.lindexi.com/post/C-%E5%BE%88%E5%B0%91%E4%BA%BA%E7%9F%A5%E9%81%93%E7%9A%84%E7%A7%91%E6%8A%80.html

WebGL实现简易的局部“马赛克”

在Canvas2D中通过调用`drawImage` API就能将图像绘制到画布上,在WebGL中我们也可以绘制图像,在绘制时我们需要用到WebGL中的纹理对象,在之前实现网格背景的视频中,我使用了一个叫做纹理坐标的配置,现在要完成纹理的加载我们也需要用到纹理坐标,并且我们可以通过对纹理坐标处理实现简...

Biwen.Settings添加对IConfiguration&IOptions的集成支持

Biwen.Settings 是一个简易的配置项管理模块,主要的作用就是可以校验并持久化配置项,比如将自己的配置存储到数据库中,JSON文件中等 使用上也是很简单,只需要在服务中注入配置, 比如我们有一个GithubSetting的配置项,我们只需要定义好对象然后注入到Service中即可: [De