【设计模式】CSharp实现创建型模式之-简单工厂、工厂方法、抽象工厂模式

感谢 TurboAI对本博客的的大力赞助。 创作不易,如果您觉得有帮助,请 支持LIncol29! 为了让我能够继续创作更好的内容,你也可以选择订阅博客的 VIP ,包年VIP仅需10元/年,所有VIP内容免费观看

前言

简单工厂其实不是一个标准的的设计模式。

GOF 23种设计模式中只有「工厂方法模式」与「抽象工厂模式」。

简单工厂模式可以看为工厂方法模式的一种特例,为了统一整理学习,就都归为工厂模式。

这三种工厂模式在设计模式的分类中都属于创建型模式,三种模式从上到下逐步抽象。

提供了一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。

工厂模式主要是负责创建对象,不要去关注上端信息,无需指定要创建的具体类。将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性。

(创建对象越复杂使用工厂方法越好,简单创建对象就没有什么优势)

简单工厂模式(Simple Factory Pattern)

简单工厂模式不是一个正式的设计模式,但它是工厂模式的基础。它使用一个单独的工厂类来创建不同的对象,根据传入的参数决定创建哪种类型的对象。

简单版

1、定义一个接口IAnimal 有个方法Move()

2、定义三个类 Dog 、Cat 、Bird类都实现IAnimal接口的Move方法

3、定义一个工厂类 ObjectFactory类,有个静态的方法 public static IAnimal CreateAnimal(Enum类型 xx)。使用enum枚举,当传入什么参数,使用Switch,new 指定类型。

4、在需要创建实例的地方 IAnimal object = new ObjectFactory.CreateAnimal(Enum类型);

代码实现

//【1】定义一个接口IAnimal 有个方法Move()
public interface IAnimal
{
     void Move();
}

//【2】定义两个个类 Dog 、Cat 类都实现IAnimal接口的Move方法
public class Dog : IAnimal
{
    public void Move()
    {
        Console.WriteLine("狗在跑来跑去!!!");
    }
}

 public class Cat : IAnimal
 {
     public void Move()
     {
         Console.WriteLine("猫在爬!!!");
     }
 }

//【3】定义一个工厂类 ObjectFactory类
//静态方法CreateAnimal,传入枚举类型
public class ObjectFactory
{
    public static IAnimal CreateInstance(Animal animal)
    {
        IAnimal instance = null;
        switch (animal)
        {
            case Animal.Dog:
                instance = new Dog();
                break;
            case Animal.Cat:
                instance = new Cat();
                break;
            default:
                throw new Exception("类型异常");
        }
        return instance;
    }

    //枚举类型
    public enum Animal
    {
        Dog,
        Cat
    }
}

//【4】调用静态方法ObjectFactory.CreateInstance
static void Main(string[] args) 
{
    //1.使用枚举将类型聚合在一起
    Console.WriteLine("*********==简单工厂===***********");
    IAnimal animal1 = ObjectFactory.CreateInstance(ObjectFactory.Animal.Dog);
    animal1.Move(); 
    Console.ReadKey();
}

升级1:使用App.config文件配置

优点:可配置

在App.config文件中加入此段

<appSettings>
    <add key="config" value="Cat"/>
</appSettings>

项目须引入 ConfigurationManager 类

在简单版第三步 ObjectFactory 类中加入此代码

private static string configString = ConfigurationManager.AppSettings["config"];

public static IAnimal CreateInstanceConfig()
{
    Animal animal = (Animal)Enum.Parse(typeof(Animal), configString);
    return CreateInstance(animal);
}

升级2:使用反射

配置文件 + 反射

优点:可配置,可拓展。不需要修改代码,只需要修改配置文件就可以新增种族

新建项目类库,

在App.config文件中加入此段。需使用.net framework搭建项目

value=”完整类型名称,完整类型命名空间”

<appSettings>
    <add key="reflection" value="DemoEasyFactoryPattern.Dog,DemoEasyFactoryPattern"/>
</appSettings>

完整类型名称:②项class后面 DemoEasyFactory.Dog 前面的命名空间可以自定义取名

完整类型命名空间:①项 DemoEasyFactoryTest 这个是项目的名称

【设计模式】CSharp实现创建型模式之-简单工厂、工厂方法、抽象工厂模式 1

同样也是在简单版第三步 ObjectFactory 类中加入此代码

private static string reflectionString = ConfigurationManager.AppSettings["reflection"];

public static IAnimal CreateInstanceReflection()
{
    Assembly assembly = Assembly.Load(reflectionString.Split(',')[1]);
    Type type = assembly.GetType(reflectionString.Split(',')[0]);
    return (IAnimal)Activator.CreateInstance(type);
}

通过反射可以添加新的种族,例如我要添加Bird类的实现。

1、创建一个类库,新建Bird类

2、引用之前写好的项目,实现IAnimal接口e

3、运行编译,将dll文件以及pdb文件复制拷贝到原先项目

【设计模式】CSharp实现创建型模式之-简单工厂、工厂方法、抽象工厂模式 2

4、修改原先项目的config文件,修改完整类型名称,完整类型命名空间 为新建类库的Bird类对应名称即可

拓展练习

【设计模式】CSharp实现创建型模式之-简单工厂、工厂方法、抽象工厂模式 3

工厂方法模式(Factort Method Pattern)

工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪个类。工厂方法将对象的创建延迟到子类。

就是建了工厂方法。每一个工厂负责单一的对象创建。给工厂也抽象出一个接口

工厂方法使用virtual 可以使用override重写拓展方法。关键字base

抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。

倾斜的可拓展性设计:产品簇拓展方便,工厂职责不能拓展(需要重写所有代码 )

1、定义一个接口IAnimal 有个方法Move()

2、定义三个类 Dog 、Cat 、Bird类都实现IAnimal接口的Move方法

3、定义一个抽象工厂类 AbstractFactory,abstract 方法 CreateInstance();继承抽象类的 abstract 方法必须重写

4、定义Dog 、Cat 、Bird的三个工厂类,例如:DogFactory,实现抽象工厂类

5、AbstractFactory af = new DogFactory(); IAnimal animal = new af.CreateInstance();

使用场景

  1. modbus类库:modbusFactory
  2. 日志记录:日志可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志的位置。
  3. 数据库访问:当用户不知道最终系统使用哪种数据库,或者数据库可能变化时。
  4. 连接服务器的框架设计:需要支持 “POP3″、”IMAP”、”HTTP” 三种协议,可以将这三种协议作为产品类,共同实现一个接口。

注意事项

工厂模式适用于生成复杂对象的场景。如果对象较为简单,通过 new 即可完成创建,则不必使用工厂模式。使用工厂模式会引入一个工厂类,增加系统复杂度。

文章参考资料

创作不易,如果您觉得有帮助,请支持LIncol29!
如有需要,请至网站地图学习本博客的教程
博客订阅:通过RSS或关注公众号[Lincol的编程世界] | 广告招租与合作请留言
本文链接:https://www.lincol29.cn/factorypattern
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议转载请注明文章地址及作者哦~

评论

  1. Windows Edge
    湖南省 联通
    4 月前
    2024-6-19 21:31:30

    太“抽象”啦

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇