感谢 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 这个是项目的名称
太“抽象”啦