zoukankan      html  css  js  c++  java
  • 一例读懂设计模式之-简单工厂模式

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


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

    缺点: 假如我们需要增加一个角色类 医生。则需要修改工厂类中的代码在其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
  • 相关阅读:
    洛谷P1175 表达式的转换
    洛谷P1725 琪露诺
    bzoj1047 [HAOI2007]理想的正方形
    洛谷P1886 滑动窗口
    最大数的和
    bzoj1087 [SCOI2005]互不侵犯King
    bzoj1051 [HAOI2006]受欢迎的牛
    Android(java)学习笔记41:Map集合功能概述
    Android(java)学习笔记40:WindowManager 中LayoutParams的各种属性
    Android(java)学习笔记39:Android 修改字体
  • 原文地址:https://www.cnblogs.com/arcticfish/p/13590687.html
Copyright © 2011-2022 走看看