工厂方法模式
来源:互联网 发布:手机个人理财软件 编辑:程序博客网 时间:2024/06/06 14:23
在简单工厂的讲解中,出现了很多问题,我们对象统一行为抽象出一个接口(或者抽象类)之后,再根据你传入的类型进行创建实例,这只适合于你有固定行为的场合,当你要实现接口的类型处于不定数时,则不适合使用简单工厂模式,而应该用工厂方法了。
适用场合:
子类有统一的操作行为
子类的数量不固定,随时可能有新的功能子类出现
工厂方法优势:
子类与子类是并列的,关系不精密,程序耦合度比较大
完全符合OCP原则,对代码的修改关闭,对代码的扩展开放
创建具体对象方法灵活,可以使用反射或者第三方IOC容器
工厂方法模式代码片断,主要从简单工厂中修改过来的,下面是结果图
1 统一操作行为,主要将统一接口抽象出来,让具体子类去实现它
1 /// <summary>2 /// 工厂方法的规定操作行为3 /// </summary>4 public interface ICreate5 {6 void Create();7 }
如果它的一部分功能对于子类是公用的,相同的,那我们需要将ICreate设计成抽象类abstract class ,代码可以是这样
1 public abstract class CreateBase 2 { 3 /// <summary> 4 /// 每个子类都公用的属性或者方法 5 /// </summary> 6 protected string CreateName 7 { 8 get 9 {10 return "一个工厂方法模式";11 }12 }13 /// <summary>14 /// 子类必须去实现的抽象方法行为15 /// </summary>16 abstract void Create();17 }
而一个建立抽象行为的工厂,它可以被其它具体行为工厂继承,它提供一个方法,叫子类工厂去实现它,并返回子类对象本身。同样,根据业务需求,可以由抽象类实现
1 /// <summary>2 /// 抽象工厂规定行为3 /// </summary>4 public interface CreateFactory5 {6 ICreate CreateObject();7 }
对于具体对象而言,它们要做的就是去实现抽象的行为,以下是一个人物类,它去实现Create方法。
1 /// <summary> 2 /// 具体对象实现 3 /// </summary> 4 public class People : ICreate 5 { 6 7 #region ICreate 成员 8 9 public void Create()10 {11 Console.WriteLine("创建人类");12 }13 14 #endregion15 }
而对于具体工厂来说,主要作用是去创建一个具体对象的实例,代码如下:
1 /// <summary> 2 /// 具体工厂进行生产对象 3 /// </summary> 4 public class PeopleFactory : CreateFactory 5 { 6 #region CreateFactory 成员 7 8 public ICreate CreateObject() 9 {10 return new People();11 }12 13 #endregion14 }
以程序调用时,我们需要先去创建一个工厂,然后再使用工厂中的方法,来完成我们的操作
1 FactoryMethod.CreateFactory createFactory = new FactoryMethod.PeopleFactory();2 FactoryMethod.ICreate iCreate = createFactory.CreateObject();3 iCreate.Create();
而这时,我们看到,代码有些不完美,那就是在创建具体工厂时还是出现了new,即还是存在着代码间的依赖,如何解除这样依赖使代码更加松耦合呢,这时,我们可以使用反射或者IOC
容器来解决这个问题:
1 string strfactoryName = ConfigurationManager.AppSettings["factoryName"];2 FactoryMethod.CreateFactory factory = (FactoryMethod.CreateFactory)Assembly.Load("FactoryMethod").CreateInstance("FactoryMethod." + strfactoryName);3 FactoryMethod.ICreate create = factory.CreateObject();4 create.Create();
我们从代码中可以看到,具体工厂的创建已经被约束到了配置文件中,这是我们可以接受的,呵呵。
事实上,微软自己在它的组件中大大使用了工厂方法模式,如MVC中的Controller的创建方法,也是这个道理。
- 工厂模式 -- 工厂方法
- 工厂模式-工厂方法
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式---工厂方法模式
- 【模式】工厂方法模式
- 工厂方法,抽象工厂模式
- C#工厂模式-工厂方法
- 工厂模式 和工厂方法
- 工厂模式-C-工厂方法
- 工厂模式以及工厂方法
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂方法、抽象工厂模式
- 工厂模式(简单工厂、工厂方法)
- 简单工厂|工厂方法|抽象工厂模式
- 设计模式-工厂模式(简单工厂模式+工厂方法模式)
- 编译与解释
- python第三方库系列之二十六--不知道被谁删了微信好友
- jar,后台运行的方式
- LBP特征原理及代码实现
- (CentOS 7)Docker:安装&配置
- 工厂方法模式
- SYBASE中显示Palette
- 用指针修改图像像素
- Windows下CriticalSection和Mutex的性能比较
- (三)03iOS-Swift版的手势密码解锁功能
- LeetCode(33) Search in Rotated Sorted Array解题报告
- C#及wpf WebBrowser截图
- CUDA编程——Warp Divergence
- simple Ubuntu chat service