2020年8月31日星期一

一例读懂设计模式之

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


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

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

 

一例读懂设计模式之亚马逊旺季如何快速爆单?Listing优化&PPC实战心怡科技即学即用的亚马逊产品发布沃尔玛9个顶级的亚马逊FBA卖家产品销量估算工具!亚马逊卖家如何爆单?跨境精细化运营攻略必看!如何通过亚马逊-SKU商品排序来提高店铺转化率最全解答:亚马逊产品促销有必要做吗?该怎么做?

没有评论:

发表评论