首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

重构C#代码以实现某种工厂设计模式

工厂设计模式是一种创建型设计模式,它提供了一种创建对象的接口,但由子类决定要实例化的具体类。这样,工厂模式使一个类的实例化延迟到其子类。

基础概念

  1. 抽象产品(Abstract Product):定义产品的接口。
  2. 具体产品(Concrete Product):实现抽象产品接口的具体类。
  3. 抽象工厂(Abstract Factory):声明创建产品对象的接口。
  4. 具体工厂(Concrete Factory):实现抽象工厂接口,负责创建具体产品。

优势

  • 解耦:客户端与具体产品类解耦,只需要知道抽象产品接口。
  • 扩展性:增加新产品时,只需添加新的具体产品和具体工厂,无需修改现有代码。
  • 维护性:便于维护和升级。

类型

  • 简单工厂模式:通过一个工厂类来创建所有产品。
  • 工厂方法模式:定义一个创建对象的接口,但由子类决定实例化哪一个类。
  • 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

应用场景

  • 当一个类不知道它所需要的对象的类
  • 当一个类希望由它的子类来指定它所创建的对象
  • 当需要将对象创建与使用分离

示例代码

假设我们有一个简单的应用程序,需要创建不同类型的形状(如圆形和矩形)。我们可以使用工厂方法模式来实现。

抽象产品

代码语言:txt
复制
public interface IShape
{
    void Draw();
}

具体产品

代码语言:txt
复制
public class Circle : IShape
{
    public void Draw()
    {
        Console.WriteLine("Drawing a Circle");
    }
}

public class Rectangle : IShape
{
    public void Draw()
    {
        Console.WriteLine("Drawing a Rectangle");
    }
}

抽象工厂

代码语言:txt
复制
public interface IShapeFactory
{
    IShape CreateShape();
}

具体工厂

代码语言:txt
复制
public class CircleFactory : IShapeFactory
{
    public IShape CreateShape()
    {
        return new Circle();
    }
}

public class RectangleFactory : IShapeFactory
{
    public IShape CreateShape()
    {
        return new Rectangle();
    }
}

客户端代码

代码语言:txt
复制
public class Client
{
    public static void Main(string[] args)
    {
        IShapeFactory circleFactory = new CircleFactory();
        IShape circle = circleFactory.CreateShape();
        circle.Draw();

        IShapeFactory rectangleFactory = new RectangleFactory();
        IShape rectangle = rectangleFactory.CreateShape();
        rectangle.Draw();
    }
}

遇到问题及解决方法

问题:如何扩展新的形状而不修改现有代码?

解决方法:遵循开闭原则(Open/Closed Principle),只需添加新的具体产品和具体工厂。

例如,添加一个新的三角形形状:

代码语言:txt
复制
public class Triangle : IShape
{
    public void Draw()
    {
        Console.WriteLine("Drawing a Triangle");
    }
}

public class TriangleFactory : IShapeFactory
{
    public IShape CreateShape()
    {
        return new Triangle();
    }
}

然后在客户端代码中使用新的工厂:

代码语言:txt
复制
IShapeFactory triangleFactory = new TriangleFactory();
IShape triangle = triangleFactory.CreateShape();
triangle.Draw();

通过这种方式,我们可以轻松地扩展系统而不影响现有代码。

总结

工厂设计模式是一种强大的工具,可以帮助我们创建灵活且易于维护的系统。通过使用抽象产品和具体工厂,我们可以实现高度的解耦和扩展性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

用C# (.NET Core) 实现抽象工厂设计模式

本文的概念性内容来自深入浅出设计模式一书. 上一篇文章讲了简单工厂和工厂方法设计模式 http://www.cnblogs.com/cgzl/p/8760250.html, 使用的是披萨店的例子....这样做就允许我们为不同的上下文使用不同实现的工厂了. 因为我们的代码是从实际产品解耦的, 我们就可以通过替换工厂来取得不同风格的产品了. ? 梳理一下整个流程 1. 创建纽约的披萨店: ? 2....到这, 代码都没有变化. 4.创建披萨的时候, 使用原料工厂: ? 5. 披萨的准备工序里是由工厂来提供原料: ? 6. 按照其他工序加工并返回披萨....抽象工厂定义 抽象工厂设计模式提供了一个接口, 这个接口可以创建一族相关或依赖的对象而无需指明它们具体的类. 下面是类图: ? 对应披萨店的图: ?...C#/.NET Core代码实现  原料接口: namespace AbstractFactoryPattern.Abstractions { public interface IGredient

1K50

C#设计模式——(创建型-抽象工厂设计模式)

一、应用场景分别用简单工厂设计模式和工厂方法设计模式实现:创建不同品牌的键盘。...抽象工厂代码如下: #region 抽象工厂 //如果要添加鼠标、显示屏等产品 public interface IMouse {...GetMouse() { return new HPMouse(); } } #endregion三、三种模式的对比简单工厂...:只有一个工厂类,一个产品抽象类,工厂类创建方法依据传入参数并判断选择创建具体的产品对象;工厂方法:有多个工厂类,一个产品抽象类,一个工厂抽象类,利用多态创建不同的产品对象,避免大量的switch case...,实现了细节依赖抽象抽象工厂:多个工厂类,多个产品抽象类,产品子类分组,同一个工厂实现类创建同组中的不同产品对象,减少了工厂子类的数量。

28820
  • C#设计模式——(创建型-简单工厂设计模式)

    一、定义简单工厂设计模式,又称静态工厂方法,不属于23中设计模式。是由工厂决定创建出哪一种产品类的实例,是工厂模式家族中最简单的模式。...,把创建对象的过程封装到静态方法中,在客户端直接调用方法,实现客户端和创建对象的解耦,明确职责}三、静态工厂方法代码//静态工厂方法,把创建对象的过程封装到静态方法中,在客户端直接调用方法,实现客户端和创建对象的解耦...cal=new Mul(); break; case"/": cal=new Div(); break; } }}四、简单工厂模式的优缺点优点...1、简单工厂模式解决了客户端直接依赖于具体对象的问题,客户端消除了创建对象的责任,仅仅承担使用的责任。...实现了责任的分割2、简单工厂也实现了代码复用。缺点1、系统扩展困难,一旦加入新功能,就必须修改工厂逻辑;2、简单工厂集合了所有创建对象的逻辑,一旦不能正常工作,会导致整个系统出现问题。

    33550

    用C#(.NET Core) 实现简单工厂和工厂方法设计模式

    本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子. 前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现....在OrderPizza()方法里面, 我们使用工厂的创建方法代替了new关键字, 所以在这里没有具体的实例化. 简单工厂的定义 简单/简易工厂并不是一个设计模式, 更多是一个编程习惯....用C#/.NET Core实现简单工厂 Pizza父类: using System; using System.Collections.Generic; namespace SimpleFactory.Pizzas...用一行代码来解释工厂方法就是: 工厂方法是让其子类具体来实现对象创建的工作. 这样就把父类中的客户代码和子类的创建对象部分的代码解耦了. 上面工作做的挺好, 但是还差一件事....披萨....C#/.NET Core的代码实现 各种pizza: namespace FactoryMethodPattern.Pizzas { public class ChicagoCheesePizza

    3K50

    设计模式——工厂模式详解(代码演示)

    一,什么是工厂模式?为什么使用工厂模式? 将对象的实例化全部交给工厂去做,你只需要告诉工厂需要什么对象,然后工厂造出来就行。...二,三种实现方式 需求案例: 披萨制作:便于披萨种类的扩展,要便于维护: 披萨种类很多:GreekPizz,chesePizz等 1.简单工厂 生产披萨 在简单工厂模式中创建实例的方法通常为静态...主要角色如下: 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。...2.工厂方法 生产多种类披萨 “工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。 主要角色如下。...抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

    26240

    C#设计模式——(创建型-工厂方法设计模式)

    一、工厂方法设计模式定义定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化,推迟到子类。...抽象工厂角色ICalFactory工厂方法模式的核心,是具体的工厂角色必须实现的接口或者必须继承的抽象类;具体工厂角色 AddFactory SubFactory包含和具体业务逻辑有关的代码,由应用程序调用以创建对应的具体产品对象...;抽象产品角色 ICalculator 是具体产品继承的父类或者接口具体产品角色类 Add Sub Mul Div具体工厂角色创建的对象,就是该类的实例二、工厂方法设计模式代码public interface...ICalculator cal=calFac.GetCalculator(); double ret=cal.GetResult(d1,d2); Console.ReadKey();}三、工厂方法设计模式与反射...ICalculator { public double GetResult(double d1,double d2) { return d1/d2; }}//1.使用Attribute给代码贴狗皮膏药

    24970

    模式设计之「工厂模式」的实现

    本文字数:1260 字 阅读本文大概需要:4 分钟 设计模式有很多种,比较流行的差不多有 23 种,对于这些模式,我们学习几种常用的即可。...「单例模式」已经在之前的文章中讲过,其中还包括对「设计模式」的解释,没有看过的可以点击右侧链接先去看一下:无处不在的「单例设计模式」 00.工厂模式 工厂是干嘛的?工厂是造东西的。...其实工厂模式和其它造对象的还是有差别的,虽然都是造对象,不同情况下的效力是有区别的。工厂模式可以帮助我们在某一些复杂的情况下,更好的对我们造的对象进行一个统一的管理,实现了创造者和构造者的分离。...就像越大的企业内部分的越细致,同理越大的软件越需要设计模式。 01.简单实现 下面就用一个简单的例子来演示一下工厂模式。...,我们有 3 种“产品”,分别是 Nike,Adidas 和 Champion,当我们因为贫穷建不成工厂的时候,我们只能自己在代码中实例化: nike = Nike() adidas = Adidas(

    37140

    设计模式Java实现-抽象工厂模式

    ✨这里是第七人格的博客✨小七,欢迎您的到来✨系列专栏:设计模式✈️本篇内容: 抽象工厂模式✈️ 本篇收录完整代码地址:https://gitee.com/diqirenge/design-pattern...楔子小七刚开始写这个设计模式专栏的时候,当时是想写成小说的形式,也设计了一些爱恨情仇,其中工厂模式是女主角,单例模式是大坏蛋,他通过抽象工厂模式克隆了一堆工厂。...今天我们就讲讲抽象工厂。需求背景假设有一家电子产品制造公司,它生产两种主要产品:智能手机和智能手表。这些产品都有不同的系列,比如高端系列和经济型系列。每个系列的产品都有其独特的设计和功能。...分析设计首先这个公司生产两种产品智能手机和智能手表,所以我们可以考虑使用一个抽象工厂接口,用于创建智能手机和智能手表产品。然后针对每个系列,再单独开一个工厂,并且这些工厂都实现于抽象工厂接口。.../tree/master/src/main/java/com/run2code/design/behavioral/abstractfactory模块描述抽象工厂模式代码示例代码实现1、编写抽象工厂接口

    5910

    设计模式学习(四): 1.简单工厂 (附C#实现)

    通过面向接口的编程, 我们可以把自己从各种变化中隔离出来, 因为如果代码是面向接口的话, 那么通过多态机制, 任何实现了该接口的新类都可以直接被使用. 所以别忘了设计原则: 对修改关闭....封装对象的创建 需要把变化的部分封装起来, 也就是把创建披萨那部分代码移动到另外一个对象里, 而这个对象将专注于创建披萨.  针对这种对象, 它有一个名字, 叫工厂(Factory)....工厂会处理对象创建的细节. 建立一个简单的披萨工厂 这个类只有一个任务: 为客户创建披萨. 为什么不适用静态(static)方法?...使用SimpleFactory之后: 简单工厂 Simple Factory 简单工厂实际上并不是设计模式, 可以更多的认为是一种编程范式. 但是使用的却是非常广泛....理清一下目前的情况: C#实现: namespace C04FactoryPattern.Bases { public interface IPizza { string

    55760

    使用C# (.NET Core) 实现抽象工厂设计模式 (Abstract Pattern)

    本文的概念性内容来自深入浅出设计模式一书. 上一篇文章讲了简单工厂和工厂方法设计模式 http://www.cnblogs.com/cgzl/p/8760250.html, 使用的是披萨店的例子....首先是工厂的接口: 然后我们要做下面这些内容: 为每个地区创建一个工厂 (实现PizzaIngredientFactory接口及其方法) 实现一些原料的类, 它们可以呗工厂使用, 其中某些原料可以跨地区共享...这样做就允许我们为不同的上下文使用不同实现的工厂了. 因为我们的代码是从实际产品解耦的, 我们就可以通过替换工厂来取得不同风格的产品了. 梳理一下整个流程 1. 创建纽约的披萨店: 2....抽象工厂定义 抽象工厂设计模式提供了一个接口, 这个接口可以创建一族相关或依赖的对象而无需指明它们具体的类....工厂方法: 抽象工厂: 总结 C#/.NET Core代码实现  原料接口: namespace AbstractFactoryPattern.Abstractions { public

    47520

    代码重构:用工厂+策略模式优化过多的if else代码块

    下面就用静态工厂+策略模式来重构这段代码(对于静态工厂模式和策略模式不知道的同学请自行百度哈 先说说思路:1、定义一个处罚的接口 ,包含一个执行处罚的方法       2、每一种情况的处罚都抽象成一个具体处罚类并继承处罚接口...(策略模式)       3、定义一个静态工厂类,用来根据情况生产具体处罚对象,然后执行处罚的方法(静态工厂模式)。...state ="late"; punish(state); } //重构后的处罚逻辑 public static void punish(String...punish.exePunish(); } } 重构后的处罚逻辑简单、清晰,后续新增一种情况,只需定义一个相应的类即可,根本不需要修改处罚逻辑,完全解耦合,这大大提高了代码的可读性和可维护性。...不过,运用静态工厂+策略模式,也存在弊端,那就是会增加很多类;但是,当每种情况的逻辑代码很多、很复杂的时候,那么这个弊端就可以忽略不计,其优势就完全展示出来了。

    56021

    优秀代码---改善代码三部曲:重构、设计模式、重构与模式

    一、改善代码的三部曲 《设计模式》-> 《重构》-> 《重构与模式》。也就是设计->重构->重构出新设计,改善代码的三部曲: 第一部曲?...重构是实现设计模式的一种手段,设计模式往往也是重构的目的。...二、重构与模式的缘由 应该通过重构实现模式、趋向模式和去除模式(refactoring to, towards, and away from pattern),而不是在预先设计中使用模式,也不再过早的在代码中加入模式...有些开始设计的时候,认为某些地方会频繁的改动,甚至开始使用了某种设计模式预留扩展, 但是后来却没怎么动,也就是导致了废设计和功能. 2....4.演进式设计 演进式设计即趋向性设计,主要是避免过度设计。 通过重构产生设计结构,也就是通过重构实现模式或者重构趋向模式。

    56540

    C#之三十八 简单工厂设计模式

    使用设计​​模式​​是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。...使用设计​​模式​​是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。...设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。 ​ 4.3.1、"开放-封闭"原则​ 此原则是由"Bertrand Meyer"提出的。...4.9、模式实现​ 我们通过上面的分析,已经清晰的知道了工厂模式中的各种角色和职责,那工厂模式通过代码是怎么实现的呢?...OK,下面将继续分析上面的吃早餐中的故事,做一个简单的示例实现。 1、首先我们来看看只有一个产品对象的简单工厂模式的实现。其实这很好理解,就当店里只卖一种食品,这里以馒头为例。

    9510

    C#设计模式05——抽象工厂的写法

    C# 抽象工厂是一种创建型设计模式,它提供了一种封装一组相关或相互依赖对象创建的方法。该模式使得客户端能够创建与应用程序所使用的特定工厂无关的对象。 以下是C#抽象工厂5W1H的解释: 1....What是C#抽象工厂? C#抽象工厂是一种创建型设计模式,它提供了创建一组相关或相互依赖对象的方法。它使用一种抽象工厂接口来定义一组创建相关对象的方法,该接口在运行时绑定到具体的工厂类。...这使得客户端能够创建与应用程序所使用的特定工厂无关的对象。 2. Why使用C#抽象工厂? 使用C#抽象工厂可以将对象的创建和实现细节与客户端代码分离开来,从而使得代码更加灵活、易于扩展和维护。...- 需要将对象创建和实现细节与客户端代码分离开来,提供更高的代码可读性和可维护性。 6. How使用C#抽象工厂?...- 创建一组具体产品类,分别实现抽象产品接口中的方法,用于实现相关产品的具体功能。 - 在客户端代码中,通过抽象工厂接口创建一组相关产品的对象,并使用这些对象的通用接口来操作它们。

    14420

    C#设计模式03——简单工厂的写法

    什么是C#简单工厂? C#简单工厂是一种创建对象的设计模式,它定义一个工厂类来创建指定类型的对象,而不是在客户端代码中直接创建对象。...简单工厂模式通常使用静态方法来生成对象,并且这些静态方法通常被称为工厂方法。 为什么要使用C#简单工厂? C#简单工厂模式的主要目的是隐藏创建对象的复杂性,并提供一个可控的对象创建过程。...这种方式可以降低客户端代码的耦合性,提高代码的可维护性和可扩展性,并能够在对象的创建过程中尽可能地避免代码重复。 简单工厂模式应用的场景有哪些?...简单工厂模式有哪些实现方式?...C#简单工厂模式通常有两种实现方式,分别是基于接口和基于抽象类的实现方式。

    23930

    设计模式(6)-JavaScript如何实现抽象工厂模式?

    1 学习目标 通过本篇文章的学习,你应当掌握以下知识: 1 知道什么是抽象工厂模式? 2 掌握抽象工厂模式的作用以及什么时候需要使用抽象工厂模式 3 掌握使用JS实现抽象工厂模式的代码编写。...2 什么是抽象工厂模式? 抽象工厂模式提供了一种封装一组具有相同主题的单个工厂而无需指定其具体类的方法。即工厂的工厂;一个将单个相关/从属工厂分组在一起的工厂,但未指定其具体类别。...当您需要产品之间的一致性时 在将新产品或产品系列添加到程序时,您不想更改现有代码。 4 抽象工厂模式参与者 ?...产品 : 1 工厂创建的产品实例 AbstractProduct: 1 在JavaScript中没有使用 2 声明要创建的产品的接口 5 代码实现 因为JavaScript不支持基于类的继承,因此,在下面的...因此在JavaScript中,我们必须确保每个“ Concrete”对象与其他对象具有相同的接口定义(即属性和方法),以确保自身的一致性。

    1.1K41

    C#设计模式04——工厂方法的写法

    What是C#工厂方法? C#工厂方法是一种设计模式,它通过创建具有相同基类的对象来实现代码的重用和灵活性。 2. Why使用C#工厂方法?...使用C#工厂方法有以下好处: - 降低了代码的耦合性,让代码更易于扩展和修改; - 隐藏了对象的创建细节,将对象的创建从客户端代码中分离出来; - 能够让客户端代码更简洁,并且提供了更好的灵活性。...Who可以使用C#工厂方法?1 任何使用C#语言的开发人员都可以使用C#工厂方法。 4. Where可以使用C#工厂方法?...使用C#工厂方法的最佳时机是当你需要创建多个对象具有相同的基类,或者当你需要通过隐藏对象的创建细节来提供更好的灵活性时。 6. How使用C#工厂方法?...使用C#工厂方法分为以下几个步骤: - 定义一个基类; - 定义一个抽象工厂类,其中包含一个抽象的方法来创建对象; - 定义具体的工厂类,实现抽象工厂类中的抽象方法,并根据需要去实例化具体对象; - 在客户端代码中使用具体的工厂类创建对象

    16010

    设计模式之简单工厂模式(Simple Factory Pattern)问题引出建立简单pizza工厂重构PizzaStore类小结

    简单工厂模式其实并不是一个设计模式,反而像是一种比较常用的编程习惯!他还有个名字叫静态工厂方法(Static Factory Method)模式。...简单工厂模式应该是工厂模式家族中最简单的一种模式,同时也是很常用的一种模式。 我们一如既往的通过实际问题的模拟来学习简单工厂模式!...pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } 其中这部分代码都是在实现..."cock")) { pizza = new CockPizza(); } return pizza; } } 这样就实现了简单工厂模式...Paste_Image.png 简单工厂模式严格的说不是一种设计模式,而是一种编程习惯,他的核心思想就是,将会发生变化的实例化代码抽离出来,新建一个简单工厂类将其封装起来!

    36340
    领券