一例读懂设计模式之-简单工厂模式
设计模式-创建模式-简单工厂模式
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在工厂类中执行。
缺点: 假如我们需要增加一个角色类 医生。则需要修改工厂类中的代码在其switch case中增加医生代码。同时在枚举类型中增加医生枚举。所以我们还需要进一步抽象,将会在后面的系列中通过抽象工厂模式来解决
思路:
第一步、抽象出共有的接口 。本例中抽象出人具备的两个接口 ,自我介绍方法,和工作方法。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 创建模式_2.简单工厂模式.接口 { public interface Person { void ToIntroduceMyself();//给接口定义自我介绍的方法,但是不用写具体实现 void ToWork(); //工作方法 接口里的方法不能用public private 等修饰符 } }
第二步、编写具体的实例类。让他继承抽象出的接口。以 教师为例。如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using 创建模式_2.简单工厂模式.接口; namespace 创建模式_2.简单工厂模式.角色类 { class Teacher:Person { public void ToIntroduceMyself() { Console.WriteLine("大家好!我是一名老师!"); } public void ToWork() { Console.WriteLine("我正在上课!"); } } }
第三步、编写一个工厂类。他的作用是用来实现对对象类的初始化。这样他作为一个中间层,将调用者与实例化对象隔开,实现了解耦。调用者不用关心具体的实例方法,只需要将参数传递给工厂类即可,由工厂类负责实例化出对象。
代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using 创建模式_2.简单工厂模式.接口; using 创建模式_2.简单工厂模式.角色类; namespace 创建模式_2.简单工厂模式.工厂类 { class PersonFactory //角色工厂 { public static Person toCreatePerson(Professional 职业) { if (职业 ==Professional.Teacher) { return new Teacher(); } if (职业 == Professional.Student) { return new Student(); } else { return new Lawyer(); } } } //定义一个枚举职业类型 public enum Professional { Student, Teacher, Lawyer, } }
从这一点我们可以看出,如果此时我们再需要增加一个医生职业的类,则需要修改工厂类和职业枚举类中的代码,所以简单工厂模式在对象类型不变的情况下适合使用,在对象类型变化的情况下就表现出了他的缺陷。
第四步、调用工厂类实现实例化对象
using System; using System.Collections.Generic; using System.Linq; using System.Text; using 创建模式_2.简单工厂模式.接口; using 创建模式_2.简单工厂模式.工厂类; namespace 创建模式_2.简单工厂模式 { class Program { static void Main(string[] args) { Person person = PersonFactory.toCreatePerson(Professional.Student); person.ToIntroduceMyself(); person.ToWork(); Person person1 = PersonFactory.toCreatePerson(Professional.Teacher); person1.ToIntroduceMyself(); person1.ToWork(); Console.ReadLine(); } }
WCF学习中、陆续更新笔记