【设计模式】工厂方法模式

定义


定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类

优缺点


  • 优点

针对简单工厂不容易扩展,工厂方法将实例化延迟到子类工厂,从而提供扩展

  • 缺点

每次新增产品都需要添加工厂和具体产品类,增加系统复杂性

角色


  • 客户端 --> 抽象工厂,具体工厂, 抽象产品
  • 抽象产品 --> 具体产品
  • 具体产品
  • 抽象工厂 --> 抽象产品
  • 具体工厂 --> 抽象产品,具体产品

代码


  • 抽象产品
public abstract class Phone
{
    public abstract void Call();
}
  • 具体产品
public class IPhone : Phone
{
    public override void Call()
    {
        System.Console.WriteLine("Call by IPhone");
    }
}
public class AndroidPhone : Phone
{
    public override void Call()
    {
        System.Console.WriteLine("Call by Android");
    }
}
  • 抽象工厂
public abstract class PhoneFactory
{
    public abstract Phone Create();
}
  • 具体工厂
public class IPhoneFactory : PhoneFactory
{
    public override Phone Create()
    {
        return new IPhone();
    }
}
public class AndroidFactory : PhoneFactory
{
    public override Phone Create()
    {
        return new AndroidPhone();
    }
}
  • 客户端
Phone phone = new IPhoneFactory().Create();
phone.Call();

phone = new AndroidFactory().Create();
phone.Call();

简单工厂 VS 工厂方法

假设现在需要扩展手机产品,增加鸿蒙OS手机

  • 简单工厂
  1. 增加具体手机类 HarmonyPhone
  2. 修改静态工厂方法增加HarmonyPhone判断(违反开闭原则)
  • 工厂方法
  1. 增加具体手机类 HarmonyPhone
  2. 增加具体工厂类 HarmonyFactory

总结

工厂方法模式是典型的解耦框架,通过增加抽象工厂,客户端与具体产品解耦,抽象工厂与具体产品解构

符合迪米特法则,不需要知道具体产品如何构造

符合依赖倒置原则,只依赖产品类的抽象

符合里氏替换原则,父类出现的地方都可以用子类替换,因为没有破坏继承体系

当然最重要复合开闭原则,当需要扩展产品时,并不需要改动原来代码,只需增加新的具体产品类,具体工厂类


示例代码 - Github

(0)

相关推荐

  • 重温设计模式之 Factory

    前言 创建型模式的核心干将,工厂.简单工厂.抽象工厂,还记得清么,一文回顾和对比下. 一  为什么需要工厂 系统中总是需要创建对象的,一般使用new()来创建对象.创建对象可以是简单的new(),也可 ...

  • 【设计模式】简单工厂模式

    定义 通过工厂类提供的方法,创建不同的派生类 通常创建的类都具有共同的基类/接口 优缺点 优点 客户端与具体的实现类解耦 缺点 新增产品需要修改原来工厂类的方法,不符合开闭原则 角色 客户端 --&g ...

  • 创建型设计模式--工厂模式、抽象工厂模式

    一.小案例分析 1.功能需求: 实现一个发送信息的功能,要便于扩展与维护. (1)发送信息的工具有很多,比如短信.微信.邮件.QQ等. (2)选择某个工具进行信息发送. 2.小菜鸡去实现: (1)定义 ...

  • 设计模式-工厂方法模式学习笔记

    工厂方法模式 定义 工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负 ...

  • 设计模式 | 工厂方法模式(factory method)

    定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 结构:(书中图,侵删) 一个工厂的抽象接口 若干个具体的工厂类 一个需要创建对象的抽象接口 若干个 ...

  • PHP设计模式之工厂方法模式

    PHP设计模式之工厂方法模式 上回说到,简单工厂不属于GoF的二十三种设计模式,这回可就来真家伙了,大名顶顶的工厂方法模式前来报道! GoF类图解释 工厂方法模式对比简单工厂来说,最核心的一点,其实就 ...

  • [PHP小课堂]PHP设计模式之工厂方法模式

    [PHP小课堂]PHP设计模式之工厂方法模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 设计模式(1) 工厂方法模式

    创建型模式 简单工厂模式 工厂方法模式 IOC与工厂方法模式的结合 泛型工厂 委托工厂 创建型模式 创建型模式可以隔离客户程序对需要实例化类型的依赖关系,这类模式一般通过将实例化具体对象的职责委托给第 ...

  • 【设计模式】工厂方法模式(Factory Method)

    工厂方法模式(Factory Method) 工厂方法模式分为三种: 1.普通工厂模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.首先看下关系图:举例如下:(我们举一个发送邮件和短信 ...

  • 大话设计模式笔记(六)の工厂方法模式

    栗子回顾 简单工厂模式: https://www.cnblogs.com/call-me-devil/p/10926633.html 运算类使用工厂方法模式实现 UML图 代码实现 工厂接口 /** ...

  • 【7/25】使用工厂方法模式(Factory Method Pattern)创建Page页面对象

    这是<小游戏从0到1设计模式重构>系列内容第7篇,所有源码及资料在"程序员LIYI"公号回复"小游戏从0到1"获取. 看完三姐妹中的简单工厂模式,再 ...

  • 设计模式----------工厂(Factory)模式

    作用 实现了创建者和调用者分离. 工厂模式核心/本质: 实例化对象不在使用new,而是用工厂方法代替. 将选择实现类,创建对象统一管理和控制,从而实现调用者和我们实现类解耦 工厂模式详细分类 1.简单 ...