工厂模式(Factory)

1、简单工厂 2、工厂方法 3、抽象工厂

简单工厂和工厂方法这俩个设计模式不做详细介绍,请各位看官自行百度,有大量的解释。再次我简单引用一下其他博客主对这三种模式的理解。

引言

简单工厂、工厂方法、抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽象取了出来,优化了系统的架构,并且增强了系统的扩展性。此篇博客是笔者对学完这三种模式之后一个小小的总结

简单工厂

简单工厂模式的工厂类一般是使用静态方法,通过接收的参数不同来返回不同的对象实例。不修改代码的话,是无法扩展的 优点:客户端可以免除直接创建产品对象的责任,而仅仅是“消费”产品。简单工厂模式通过这种做法实现了对责任的分割 缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了

工厂方法

工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品 优点:允许系统在不修改具体工厂角色的情况下引进新产品 缺点:由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量

抽象工厂

抽象工厂是应对产品族概念的。应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。比如,每个汽车公司可能要同时生产轿车、货车、客车,那么每一个工厂都要有创建轿车、货车和客车的方法 优点:向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,创建多个产品族中的产品对象 缺点:增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性

以上是对三种方法的介绍和优缺点描述,接下来我们使用一个实例来说明抽象工厂的创建

设计说明

案例如下,手机厂商拥有屏幕和主板这俩条生产线,不同的手机厂商生产规格不同的产品(小米公司和苹果公司) 我们进行分析,俩家手机厂商,俩条生产线生产俩种设备

1

定义如下,首先我们定义一个抽象的工厂,这个工厂的方法包含 1、创建屏幕 2、创建主板 这个抽象工厂的作用主要是让继承他的子类 实现这俩个抽象方法

/// <summary>
    /// 抽象工厂类:提供创建不同品牌的手机屏幕和手机主板
    /// </summary>
    public abstract class AbstractFactory
    {
        //工厂生产屏幕
        public abstract Screen CreateScreen();
        //工厂生产主板
        public abstract MotherBoard CreateMotherBoard();
    }

2

定义手机屏幕和手机主板的的抽象方法,因为不同的厂商对产品规格不同,所以定义好抽象的基类,再交由各不同的厂商去实现功能,实现如相

/// <summary>
    /// 屏幕抽象类:提供每一品牌的屏幕的继承
    /// </summary>
    public abstract class Screen
    {
        public abstract void print();
    }

/// <summary>
    /// 主板抽象类:提供每一品牌的主板的继承
    /// </summary>
    public abstract class MotherBoard
    {
        public abstract void print();
    }

不同厂商对屏幕和主板的实现类如下:

      /// <summary>
    /// 苹果手机屏幕
    /// </summary>
    public class AppleScreen:Screen
    {
        public override void print()
        {
            Console.WriteLine("苹果手机屏幕!");
        }
    }
    /// <summary>
    /// 苹果手机主板
    /// </summary>
    public class AppleMotherBoard:MotherBoard
    {
        public override void print()
        {
            Console.WriteLine("苹果手机主板!");
        }
    }

    /// <summary>
    /// 小米手机屏幕
    /// </summary>
    public class XiaoMiScreen:Screen
    {
        public override void print()
        {
            Console.WriteLine("小米手机屏幕!");
        }
    }

    /// <summary>
    /// 小米手机主板类
    /// </summary>
    public class XiaoMiMotherBoard :MotherBoard
    {
        public override void print()
        {
            Console.WriteLine("小米手机主板!");
        }

3

经过上面俩个步骤我们得到了不同商品的实现,现在我们还缺少一个东西,就是不同的商家对自己商品的获取实现 此时我们应该建立不同商家的工厂类,有俩个商家,我们就建立俩个工厂类,工厂中分别实现创建自己产品 实现的工厂要继承AbstractFactory

    /// 小米手机工厂类
    /// </summary>
    public class XiaoMiFactory : AbstractFactory
    {
        /// <summary>
        /// 生产小米手机屏幕
        /// </summary>
        /// <returns></returns>
        public override Screen CreateScreen()
        {
            return new XiaoMiScreen();
        }

        /// <summary>
        /// 生产小米手机主板
        /// </summary>
        /// <returns></returns>
        public override MotherBoard CreateMotherBoard()
        {
            return new XiaoMiMotherBoard();
        }
    }
   /// <summary>
    /// 苹果手机工厂
    /// </summary>
    public class AppleFactory : AbstractFactory
    {
        /// <summary>
        /// 生产苹果手机屏幕
        /// </summary>
        /// <returns></returns>
        public override Screen CreateScreen()
        {
            return new AppleScreen();
        }

        /// <summary>
        /// 生产苹果手机主板
        /// </summary>
        /// <returns></returns>
        public override MotherBoard CreateMotherBoard()
        {
            return new AppleMotherBoard();
        }
    }

4

内容创建完成,接下去我们就来进行结果的输出

       //小米工厂生产小米手机的屏幕和主板
            AbstractFactory xiaomiFactory = new XiaoMiFactory();
            Screen xiaomiScreen = xiaomiFactory.CreateScreen();
            xiaomiScreen.print();
            MotherBoard xiaomiMotherBoard = xiaomiFactory.CreateMotherBoard();
            xiaomiMotherBoard.print();

            //苹果工厂生产苹果手机屏幕和主板
            AbstractFactory appleFactory = new AppleFactory();
            Screen appleScreen = appleFactory.CreateScreen();
            appleScreen.print();
            MotherBoard appleMotherBoard = appleFactory.CreateMotherBoard();
            appleMotherBoard.print(); 

理解: 不同的商家拥有自己的工厂创建自己的产品 1、首先实例化商家工厂 2、创建不同的商品 3、调用商品功能

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员宝库

如何掌握所有的编程语言

100本前端书籍下载|前端全套视频下载 对的,我这里要讲的不是如何掌握一种编程语言,而是所有的。 本文作者王垠,代表作《完全用Linux 工作》,著名软件工...

51780
来自专栏武军超python专栏

2018年8月26日python常识和各大语言发展史

今天遇到的新单词: precision  n精确度 generator n发电机,生产者,生成器

13340
来自专栏程序员互动联盟

为什么都说java比较容易入门?

说java比较容易入门的人,应该都是正常的人,因为相比之下,java有着不可比拟的优势,对于编程新手来说这个优势,可以让他们更快的用java语言写出他们自己的东...

35880
来自专栏令仔很忙

设计模式总结之一三五

通过学习设计模式来提高写出的代码的可维护性、可复用性、可扩展性和灵活性。也就是说让系统能够达到“高内聚、低耦合”的状态。

10220
来自专栏Pythonista

day24,python习题

有两个列表,分别存放来老男孩报名学习linux和python课程的学生名字 linux=['钢弹','小壁虎','小虎比','alex','wupeiqi'...

17320
来自专栏编程

Java语言零基础菜鸟入门Java程序学习的要点

一、掌握静态方法和属性 静态方法和属性用于描述某一类对象群体的特征,而不是单个对象的特征。Java中大量应用了静态方法和属性,这是一个通常的技巧。但是这种技巧在...

21600
来自专栏领域驱动设计DDD实战进阶

关于领域对象业务逻辑中条件判断的最佳实践

15540
来自专栏领域驱动设计DDD实战进阶

关于领域对象业务逻辑中条件判断的最佳实践

这篇文章其实是大健康行业直销系统的番外篇,主要给大家讲讲如何在领域逻辑中,有效的处理业务逻辑条件判断的最佳实践问题。 大家都知道,聚合根、实体和值对象这些领域对...

31250
来自专栏程序人生 阅读快乐

[现代编译原理C语言描述].(美国)Andrew.W.Appel.清晰版

《现代编译原理:C语言描述》全面讲述了现代编译器的结构、编译算法和实现方法,是Andrew w.Apple的“虎书”——Modern Compiler Impl...

10820
来自专栏腾讯Bugly的专栏

iOS内存管理:从MRC到ARC实践

对于iOS程序员来说,内存管理是入门的必修课。引用计数、自动释放等概念,都是与C语言完全不同的。搞明白这些,代码才有可能不 crash。然而就是这么牛逼的内存管...

37450

扫码关注云+社区

领取腾讯云代金券