• 简单工厂模式


    代码说明:一个动物基类Animal,两个子类分别是猫Cat和狗Dog。对于动物的叫声的调用,使用工厂CryFactory.Cry来选择对象进行实例后调用。

    1.代码实现

    using System;
    
    namespace mydotnet
    {
        class Program
        {
            static void Main(string[] args)
            {
                foreach(var arg in args)
                {
                    Animal animal = CryFactory.Cry(arg);
                    animal.Cry();
                }
            }
        }
    
        public class CryFactory
        {
            public static Animal Cry(string type)
            {
                switch(type)
                {
                    case "Cat":
                        return new Cat();
                    case "Dog":
                        return new Dog();
                    default:
                        return new Animal();
                }
            }
        }
    
        public class Animal
        {
            public virtual void Cry()
            {
                Console.WriteLine("^");
            }
        }
    
        public class Cat:Animal
        {
            public override void Cry()
            {
                Console.WriteLine("喵喵");
            }
        }
    
        public class Dog:Animal
        {
            public override void Cry()
            {
                Console.WriteLine("汪汪");
            }
        }
    
    }

    2.运行

    vscode 运行: dotnet run "Cat"  (args直接在run后面可以设置值,多个值用逗号隔开)

    3.面向对象

    简单工厂模式非常适合设计模式的入门,而且很好的使用了面向对象的三大特性:封装、继承、多态。

      封装,即为抽象出一个类,说白了就是归类。Animal、Cat、Dog都是封装出来的类。

        每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。

      继承,Cat和Dog都继承自Animal,子类会继承父类所有的特性,子类还可以定义新的特性,子类还可以用自己的方式实现父类的功能(override virtual)。

      多态,不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行,需要注意几点:

        1.子类以父类的身份出现

        2.子类工作时以自己的方式来实现

        3.子类以父类的身份出现时,子类特有的属性和方法不可以使用

        多态的实现方式:虚方法、接口、抽象类  

    4.简单工厂模式

      简单工厂模式用于解决“switch的复用”问题

        以代码的业务为例,对于动物的不同,调用不用的动作时,switch的操作不应在过程中编写,而应该提炼出来,实现可复用。

         简单工厂模式也可以减低耦合度,此例不明显。

        比如mssql改为mysql时,因为实例不是在过程中而是在工厂中,那么只需要更改工厂中的实例方式就可以,而不用把所有调用的地方都修改一遍。

  • 相关阅读:
    C++ string 类详解
    C语言 -- 字符串详解
    基本数据结构 -- 链表的遍历、查找、插入和删除
    Shell 基础 -- 总结几种括号、引号的用法
    用 C 语言描述几种排序算法
    Win10 + vs2017 编译并配置tesseract4.1.0
    前端如何引入vConsole
    php设计模式-数据对象映射模式
    PHP设计模式-策略模式
    PHP设计模式-适配器模式
  • 原文地址:https://www.cnblogs.com/wangliuwei/p/11788019.html
Copyright © 2020-2023  润新知