首页 > 其他分享 >FactoryPattern-工厂模式

FactoryPattern-工厂模式

时间:2023-08-08 10:34:08浏览次数:33  
标签:创建 模式 public Produce new FactoryPattern 工厂 class

在C#中,工厂模式(Factory Pattern)是一种常用的设计模式,它属于创建型模式。在C#中,工厂模式用于创建对象,而不需要直接使用构造函数来实例化对象。它通过一个工厂类来封装对象的创建逻辑,使得客户端只需要与工厂类交互,而无需关心具体的对象创建过程。

1.简单工厂

简单工厂模式(Simple Factory Pattern)是工厂模式的一种简化形式,通常包含以下几个核心角色:

产品接口(Product Interface):定义了产品对象的接口,即产品所具有的方法和属性。

具体产品(Concrete Product):实现产品接口的具体产品类,它是工厂模式所创建的对象。

简单工厂(Simple Factory):负责创建具体产品对象的工厂类,根据不同的参数或条件来创建不同的具体产品对象。

 

        //产品接口(汽车)
        interface ICar
        {
            void Produce();
        }
        //具体产品(A型轿车)
        public class CarA : ICar
        {
            public void Produce()
            {
                Console.WriteLine("produce CarA");
            }
        }
        //具体产品(B型轿车)
        public class CarB : ICar
        {
            public void Produce()
            {
                Console.WriteLine("produce CarB");
            }
        }
        //简单工厂(汽车制造工厂)
        class SimpleFactory
        {
            public static ICar CreateProduct(string type)
            {
                switch (type)
                {
                    case "A":
                        return new CarA();
                    case "B":
                        return new CarB();
                    default:
                        throw new ArgumentException("Invalid product type");
                }
            }
        }
        //客户端代码
        static void Main(string[] args)
        {
            //需要A型号汽车
            ICar productA = SimpleFactory.CreateProduct("A");
            productA.Produce();

            //需要B型号汽车
            ICar productB = SimpleFactory.CreateProduct("B");
            productB.Produce();
        }

简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。当需要增加产品CraC(C型轿车)时,需要增加工厂的Swith分支。不修改代码的话,是无法扩展的,不符合开闭原则。

2.工厂方法

工厂方法模式(Factory Method Pattern)的核心思想是将对象的创建过程交给子类来完成,从而提供了一种扩展的方式,使得新的子类可以根据需要创建不同的产品对象,而不影响客户端代码。通常包含以下几个核心角色:

产品接口(Product Interface):定义了产品对象的接口,即产品所具有的方法和属性。

具体产品(Concrete Product):实现产品接口的具体产品类,它是工厂方法模式所创建的对象。

抽象工厂(Abstract Factory):定义了一个创建产品对象的抽象方法,让具体工厂子类来实现。

具体工厂(Concrete Factory):继承抽象工厂类,实现抽象工厂中的抽象方法,负责创建具体的产品对象。

//具体产品(C型轿车)
        public class Carc : ICar
        {
            public void Produce()
            {
                Console.WriteLine("produce CarC");
            }
        }        
        // 抽象工厂
        abstract class Factory
        {
            public abstract ICar CreateProduct();
        }
        // 具体工厂A
        class ConcreteFactoryA : Factory
        {
            public override ICar CreateProduct()
            {
                return new CarA();
            }
        }
        // 具体工厂B
        class ConcreteFactoryB : Factory
        {
            public override ICar CreateProduct()
            {
                return new CarB();
            }
        }
        // 具体工厂C
        class ConcreteFactoryC : Factory
        {
            public override ICar CreateProduct()
            {
                return new CarC();
            }
        }
        //客户端代码
        static void Main(string[] args)
        {
            Factory factoryA = new ConcreteFactoryA();
            ICar productA = factoryA.CreateProduct();
            productA.Produce();

            Factory factoryB = new ConcreteFactoryB();
            ICar productB = factoryB.CreateProduct();
            productB.Produce();

            Factory factoryC = new ConcreteFactoryC();
            ICar productC = factoryC.CreateProduct();
            productC.Produce();
        }

工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。符合开闭原则,但随着产品类的增加,对应的工厂也会随之增多。

 3.工厂模式

工厂模式(Factory Pattern)用于创建对象,而不需要直接使用构造函数来实例化对象。它通过一个工厂类来封装对象的创建逻辑,使得客户端只需要与工厂类交互,而无需关心具体的对象创建过程。

工厂模式和工厂方法模式的主要区别在于角色的不同以及使用的场景。

角色的不同:

工厂模式中,通常包含一个抽象工厂类和多个具体工厂类,抽象工厂类定义了一个或多个创建产品对象的抽象方法,而具体工厂类继承抽象工厂类并实现这些抽象方法,负责具体的产品对象的创建。

工厂方法中,通常包含一个抽象工厂类和多个具体工厂类,抽象工厂类定义了创建产品对象的抽象方法,而具体工厂类继承抽象工厂类并实现这个抽象方法,负责具体产品对象的创建。每个具体工厂类对应一个具体的产品类。

 使用的场景:

工厂模式适用于需要创建一族相关或相互依赖的对象的场景。它提供一个抽象的工厂类,通过子类化这个工厂类来创建不同的产品族,具体的产品族由不同的具体工厂类来创建。

工厂方法适用于需要创建单一对象的场景。它将对象的创建延迟到子类中进行实现,使得每个具体工厂类负责创建特定的产品对象。

 创建两个产品系列类,Car和Bus

    public class Car
    {
        public abstract class AbstractCar
        {
            public abstract void Produce();
        }
        public class CarA : AbstractCar
        {
            public override void Produce()
            {
                Console.WriteLine("produce CarA");
            }
        }
        public class CarB : AbstractCar
        {
            public override void Produce()
            {
                Console.WriteLine("produce CarB");
            }
        }
    }
    public class Bus
    {
        public abstract class AbstractBus
        {
            public abstract void Produce();
        }
        public class BusA : AbstractBus
        {
            public override void Produce()
            {
                Console.WriteLine("produce BusA");
            }
        }
        public class BusB : AbstractBus
        {
            public override void Produce()
            {
                Console.WriteLine("produce BusB");
            }
        }
    }

定义产品线,具体工厂宝马和比亚迪分别生产不同系列的Car与Bus

    public interface IAbstractFactoryA
    {
        AbstractCar CreateCar();
        AbstractBus CreateBus();
    }
    public class BMFactory : IAbstractFactoryA
    {
        public AbstractCar CreateCar()
        {
            return new CarA();
        }

        public AbstractBus CreateBus()
        {
            return new BusA();
        }
    }
    public class BYDFactory : IAbstractFactoryA
    {
        public AbstractCar CreateCar()
        {
            return new CarB();
        }

        public AbstractBus CreateBus()
        {
            return new BusB();
        }
    }

客户端代码

        static void Main(string[] args)
        {
            BMFactory bMFactory = new BMFactory();
            bMFactory.CreateCar();
            bMFactory.CreateBus();

            BYDFactory bYDFactory = new BYDFactory();
            bYDFactory.CreateCar();
            bYDFactory.CreateBus();
        }

 

标签:创建,模式,public,Produce,new,FactoryPattern,工厂,class
From: https://www.cnblogs.com/ZHIZRL/p/17613518.html

相关文章

  • python工厂模式
    ##py_factory.py#py_learn##CreatedbyZ.Steveon2023/8/810:17.##工厂模式优点:#1.大批量创建对象是,有统一的入口,易于代码维护。#2.当发生修改时,只需要修改工厂类的创建方法即可#3.符合现实世界的模式,即由工厂来制作产品(对象)classPerson:......
  • Python单例模式
    ##py_singleton.py#py_learn##CreatedbyZ.Steveon2023/8/809:45.###查看对象地址demo#classUtility:#pass###u1=Utility()#u2=Utility()###输出发现u1、u2两个对象的地址不一样#print(u1)#print(id(u1))#print(u2)#......
  • RunnerGo配置场景时接口模式该怎么选
    在进行性能测试时,测试场景的正确配置非常关键。首先,需要根据业务场景和需求,设计出合理的测试场景,再利用相应的工具进行配置,实现自动化的性能测试。在JMeter中,用户需要自己组织测试场景,或是在同一文件中维护多个测试场景,而且每个测试场景必须单独设置各种元素,并且执行测试场景也需......
  • Freemium及其他常见商业模式介绍
    目录Freemium模式基于广告模式订阅制模式小结Freemium模式Freemium是一种常见的商业模式,其基本思路是提供部分服务或产品免费,而更高级或完整的服务需要付费。Freemium的具体运作模式通常如下:提供基础版本产品或服务免费,这是产品或服务的主要核心功能和价值所在。免费版让用......
  • 并发编程 - 模式与应用
    限制1、限制对CPU的使用单核CPU下,while(true)里如果什么都不干,CPU会空转占用会很快达到100%。这时while(true)里哪怕用sleep(1)也会大幅降低cpu占用sleep实现while(true){try{Thread.sleep(50);}catch(InterruptedExceptione){e.prin......
  • RunnerGo配置场景时接口模式该怎么选
    在进行性能测试时,测试场景的正确配置非常关键。首先,需要根据业务场景和需求,设计出合理的测试场景,再利用相应的工具进行配置,实现自动化的性能测试。在JMeter中,用户需要自己组织测试场景,或是在同一文件中维护多个测试场景,而且每个测试场景必须单独设置各种元素,并且执行测试场景也需要......
  • Java后端06(代理模式)
    代理模式​ spring中就使用了代理模式,Java中的代理模式分为一下两种静态代理:最简单,但是每次修改都需要重新编译动态代理:分为两种(jdk动态代理--通过接口实现来进行代理&cglib动态代理--通过子类继承来实现代理)静态代理​ 静态代理致命问题:代理对象必须提前编译好,所有代......
  • Element UI 在非template/render 模式下使用ICON要注意的问题
    有很多时候,我们不需要编译Vue和ElementUI,只是想简单的试用一下,做一个原型出来。我们会使用HTML方式编写,这种方式下,使用ICON需要注意一些问题。1.例如CopyDocument图标,如果是用htmltag方式调用,根据vue的组件规范,驼峰格式需要改写成小写横线分割的格式<copy-document></copy-docu......
  • Java设计模式的七大基本原则
    设计模式是为了让程序(软件)具有更好的代码重用性,可读性,可扩展性,可靠性,使程序呈现高内聚,低耦合的特性设计模式的原则其实就收是程序员在编写时,应当遵守的原则,也是各种模式的基础(Java设计模式的七大基本原则)一、单一职责原则<A>对类来说的,即一个类应只负责一项职责,如果A负责......
  • Redis从入门到放弃(9):集群模式
    前面文章我们介绍了Redis的主从模式是一种在Redis中实现高可用性的方式,但也存在一些缺点。1、主从模式缺点写入单点故障:在主从模式中,写入操作只能在主节点进行,如果主节点宕机,写入将无法执行。虽然可以通过升级从节点为主节点来解决,但这会增加故障切换的复杂性。写入压力分......