zoukankan      html  css  js  c++  java
  • C#设计模式——工厂方法模式

    一、工厂方法模式介绍:

    在前面简单工厂模式中讲到其缺点——难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,而本次介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题。工厂方法模式的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,克服了简单工厂模式中缺点,也很好地符合了开放封闭原则。这里还是以之前简单工厂模式中笔记本的例子来讲解一下。

    二、代码实现:

    1、和简单工厂模式一样先抽象出笔记本父类:

        /// <summary>
        /// 笔记本抽象父类
        /// </summary>
        public abstract class NoteBook
        {
            public abstract void SayHello();
        }

    2、各品牌笔记本继承于笔记本抽象父类,并重写父类抽象方法:

        /// <summary>
        /// 联想笔记本
        /// </summary>
        public class Lenovo : NoteBook
        {
            public override void SayHello()
            {
                Console.WriteLine("我是联想笔记本,你联想也别想");
            }
        }
        /// <summary>
        /// IBM笔记本
        /// </summary>
        public class IBM : NoteBook
        {
            public override void SayHello()
            {
                Console.WriteLine("我是IBM笔记本");
            }
        }

    3、简单工厂和工厂方法的区别——抽象出制造工厂父类:

        /// <summary>
        /// 制造工厂抽象父类
        /// </summary>
        public abstract class Creator
        {
            public abstract NoteBook CreateNoteBookFactory();
        }

    4、各笔记本品牌工厂子类继承于制造工厂抽象父类,并重写抽象方法返回创建各自笔记本品牌子类对象:

        /// <summary>
        /// 联想笔记本工厂类
        /// </summary>
        public class LenovoFactory : Creator
        {
            public override NoteBook CreateNoteBookFactory()
            {
                return new Lenovo();
            }
        }
        /// <summary>
        /// IBM笔记本工厂类
        /// </summary>
        public class IBMFactory : Creator
        {
            public override NoteBook CreateNoteBookFactory()
            {
                return new IBM();
            }
        }

    7、调用:

            static void Main(string[] args)
            {
                //初始化联想笔记本电脑工厂
                Creator lenovoFactory = new LenovoFactory();
                //开始生产联想笔记本
                NoteBook lenovo = lenovoFactory.CreateNoteBookFactory();
                lenovo.SayHello();
    
                //初始化IBM笔记本电脑工厂
                Creator iBMFactory = new IBMFactory();
                //开始生产IBM笔记本
                NoteBook iBM = iBMFactory.CreateNoteBookFactory();
                iBM.SayHello();
    
                Console.ReadKey();
            }

    使用工厂方法实现的系统,如果系统需要添加新产品时,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。例如,我们我们还想生产一个Acer笔记本,此时我们只需要定义一个Acer笔记本具体工厂类Acer笔记本类就可以了。而不用像简单工厂模式中那样去添加case语句。具体代码为:

        public class Acer : NoteBook
        {
            public override void SayHello()
            {
                Console.WriteLine("我是Acer笔记本");
            }
        }
        public class AcerFactory : Creator
        {
            public override NoteBook CreateNoteBookFactory()
            {
                return new Acer();
            }
        }
                //另外初始化一个Acer笔记本电脑工厂
                Creator acerFactory = new AcerFactory();
                //开始生产Acer笔记本
                NoteBook acer = acerFactory.CreateNoteBookFactory();
                acer.SayHello();

    三、总结:

    NoteBook类:充当抽象产品角色,具体产品的抽象类。任何具体产品都应该继承该类

    Lenovo和IBM类:充当具体产品角色,实现抽象产品类对定义的抽象方法,由具体工厂类创建,它们之间有一一对应的关系。

    LenovoFactory和IBMFactory类:充当具体工厂角色,用来创建具体产品

    Creator类:充当抽象工厂角色,任何具体工厂都必须继承该抽象类

  • 相关阅读:
    安装python3的详细教程
    MySQL中的各种引擎
    MySQL的语句执行顺序
    MySQL 5.7新增加的json数据类型
    MySQL5.6 PERFORMANCE_SCHEMA 说明
    MySQL中的sys系统数据库是干嘛的
    MySQL中information_schema数据库是干啥的
    mysql中You can’t specify target table for update in FROM clause错误解决方法
    win10 localhost 解析为::1 的解决办法
    python 中对象is和==是怎么比较的
  • 原文地址:https://www.cnblogs.com/jiechou/p/9064513.html
Copyright © 2011-2022 走看看