一例读懂设计模式之-简单工厂模式

设计模式-创建模式-简单工厂模式


意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在工厂类中执行。
 

缺点: 假如我们需要增加一个角色类 医生。则需要修改工厂类中的代码在其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 等修饰符

    }
}
View Code

第二步、编写具体的实例类。让他继承抽象出的接口。以 教师为例。如下

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("我正在上课!");
        }
    }
}
View Code

第三步、编写一个工厂类。他的作用是用来实现对对象类的初始化。这样他作为一个中间层,将调用者与实例化对象隔开,实现了解耦。调用者不用关心具体的实例方法,只需要将参数传递给工厂类即可,由工厂类负责实例化出对象。

代码如下

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,

    }
}
View Code

从这一点我们可以看出,如果此时我们再需要增加一个医生职业的类,则需要修改工厂类和职业枚举类中的代码,所以简单工厂模式在对象类型不变的情况下适合使用,在对象类型变化的情况下就表现出了他的缺陷。

 

第四步、调用工厂类实现实例化对象

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();
        }
    }
View Code

 

posted @ 2020-08-31 17:26  北冰洋的鱼  阅读(270)  评论(0编辑  收藏  举报