前言
简单工厂其实不是一个标准的的设计模式。
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 这个是项目的名称
同样也是在简单版第三步 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文件复制拷贝到原先项目
4、修改原先项目的config文件,修改完整类型名称,完整类型命名空间 为新建类库的Bird类对应名称即可
拓展练习
工厂方法模式(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();
使用场景
- **modbus类库:**modbusFactory
- 日志记录:日志可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志的位置。
- 数据库访问:当用户不知道最终系统使用哪种数据库,或者数据库可能变化时。
- 连接服务器的框架设计:需要支持 "POP3″、"IMAP"、"HTTP" 三种协议,可以将这三种协议作为产品类,共同实现一个接口。
注意事项
工厂模式适用于生成复杂对象的场景。如果对象较为简单,通过 new 即可完成创建,则不必使用工厂模式。使用工厂模式会引入一个工厂类,增加系统复杂度。
文章参考资料
- C#文章集合:更全面的C#知识点文章
- 【设计模式】C# 实现行为型模式之 -- 观察者模式:常用的观察者模式实现
- 【设计模式】C# 实现结构型模式之 -- 适配器模式:结构型模式 ------ 适配器模式