博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之工厂方法模式
阅读量:4093 次
发布时间:2019-05-25

本文共 2645 字,大约阅读时间需要 8 分钟。

一、定义

在上一节中,我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而工厂方法模式(Factory Method),又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

应用场景:

  • 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
  • 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
  • 客户不关心创建产品的细节,只关心产品的品牌

二、模式的结构与实现

工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成。本节来分析其基本结构和实现方法。

工厂方法模式的主要角色如下。

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
  2. 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

 

三、实际场景

因为要拍摄《速度与激情8》,导演组车的种类增多了,阵容也更加豪华了,加上导演古怪的性格,可能每一场戏就需要试驾几十种车。如果车库没有的车(具体产品类),则需要由场务(具体工厂类)直接去4S店取,这样每增加一种车(具体产品类),就要对应的有一个场务(具体工厂类),他们互相之间有着各自的职责,互不影响,这样可扩展性就变强了。

代码

///     /// 抽象产品类: 汽车    ///     public interface ICar    {        void GetCar();    }    ///     /// 抽象工厂    ///     public interface IFactory    {        ICar CreateCar();    }    ///     /// 具体产品类: 跑车    ///     public class SportCar : ICar    {        public void GetCar()        {            Console.WriteLine("场务把——跑车,交给主角");        }    }    ///     /// 具体产品类: 越野车    ///     public class JeepCar : ICar    {        public void GetCar()        {            Console.WriteLine("场务把——越野车,交给主角");        }    }    ///     /// 具体产品类: 货车    ///     public class HatchbackCar : ICar    {        public void GetCar()        {            Console.WriteLine("场务把——货车,交给主角");        }    }    //     ///  具体工厂类: 用于创建跑车类    ///     public class SportFactory : IFactory    {        public ICar CreateCar()        {            return new SportCar();        }    }    ///     ///  具体工厂类: 用于创建越野车类    ///     public class JeepFactory : IFactory    {        public ICar CreateCar()        {            return new JeepCar();        }    }    ///     ///  具体工厂类: 用于创建货车类    ///     public class HatchbackFactory : IFactory    {        public ICar CreateCar()        {            return new HatchbackCar();        }    }    //客户端    public class Program    {        static void Main(string[] args)        {            ICar car;            try            {                IFactory factory = new SportFactory();                Console.WriteLine("主角下一场戏开——跑车。");                car = factory.CreateCar();                car.GetCar();                Console.ReadKey();            }            catch (Exception ex)            {                Console.WriteLine(ex.Message);            }                   }    }

 

 

四、优缺点

优点:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
  • 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
  • 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

缺点:

  • 类的个数容易过多,增加复杂度
  • 增加了系统的抽象性和理解难度
  • 抽象产品只能生产一种产品,此弊端可使用解决。

参考:

 

转载地址:http://xjiii.baihongyu.com/

你可能感兴趣的文章
configure: error: Please reinstall the BZip2 distribution
查看>>
OpenCV gpu模块样例注释:video_reader.cpp
查看>>
【增强学习在无人驾驶中的应用】
查看>>
《python+opencv实践》四、图像特征提取与描述——29理解图像特征
查看>>
《python+opencv实践》四、图像特征提取与描述——30Harris 角点检测
查看>>
《python+opencv实践》四、图像特征提取与描述——31 Shi-Tomasi 角点检测& 适合于跟踪的图像特征
查看>>
OpenCV meanshift目标跟踪总结
查看>>
人工神经网络——神经元模型介绍
查看>>
人工神经网络——感知器介绍
查看>>
人工神经网络——反向传播算法(BackPropagation)
查看>>
进程的地址空间概述
查看>>
Windows 窗口底层原理
查看>>
一种函数指针的运用
查看>>
Win32程序之进程的原理
查看>>
C++虚函数原理
查看>>
MySQL的索引
查看>>
今天,Python信息量很大!
查看>>
Flash 已死,Deno 当立?
查看>>
编程差的程序员,90%都是吃了数学的亏!骨灰级开发:方法不对,努力也白费...
查看>>
编程差的程序员,90%都是吃了数学的亏!骨灰级开发:方法不对,努力也白费...
查看>>