51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

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

前言

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

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 即可完成创建,则不必使用工厂模式。使用工厂模式会引入一个工厂类,增加系统复杂度。

文章参考资料

赞(0)
未经允许不得转载:工具盒子 » 【设计模式】CSharp实现创建型模式之-简单工厂、工厂方法、抽象工厂模式