大话设计模式之简单工厂模式笔记

代码规范:

代码命名需要有具体的含义,切不可以用A,B,C等字符代替面试题里面的数字,可用strNumberA,strNumberB等。

面向对象的分析设计编程思想,可以通过面向对象三大特性封装、继承、多态把程序的耦合度降低,使程序更加灵活。

业务封装(封装)

让业务逻辑和界面逻辑分开,让它们之间的耦合度下降。简单来说就是将业务写到单独的一个类里。

简单工厂模式(继承和多态)

主要是根据获取的参数来判断到底要实例化谁,用一个单独的类来做这个创造实例的过程,这就是工厂。

在使用继承编程的时候,我们一般是把不同子类的方法分别写在不同的子类中,使用的时候用is a关键字来判断对象是哪种类的,然后进行强制转换来使用不同对象的方法。 但是,如果有多个子类的话,使用的时候难道要写多个if语句来判断对象是哪种类型的吗?这样会产生很多冗余代码,也会很繁琐。使用多态编程可以很好的解决这个问题。在父类写一个虚方法或抽象方法,子类去重写父类的方法,在调用的时候系统会根据对象运行时的类型决定调用哪个方法。这样子是不是简洁多了?

下面这段代码应用了继承,但是子类方法的判断是用的if语句is a关键字来判断的。

通过这段代码可以发现:在使用子类对象的时候需要先用is a来判断子类对象时哪种类型的。那么也就是说,如果一个父类有10个派生类(子类)的话,就要用10个if判断语句来判断子类对象是哪种类型了,未免太过繁琐。这时,虚方法就该登场了。

/// <summary>
    /// 演示类
    /// </summary>
    class Demo
    {
        List<Book> books = new List<Book>();

        /// <summary>
        /// 测试
        /// </summary>
        public void Test()
        {
            books.Add(new ComputerBook());
            books.Add(new JavaBook());

            foreach (Book item in books)
            {
                if (item is ComputerBook)
                {
                    ((ComputerBook)item).ByReading();
                }
                if (item is JavaBook)
                {
                    ((JavaBook)item).ByReading();
                }
            }
        }
    }

    /// <summary>
    /// 书类
    /// </summary>
    class Book
    {
        
    }

    /// <summary>
    /// 计算机书籍
    /// </summary>
    class ComputerBook : Book
    {
        /// <summary>
        /// 被阅读
        /// </summary>
        public void ByReading()
        {
            Console.WriteLine("我是计算机类书籍,被在校大学生使用。");
        }
    }

    /// <summary>
    /// Java书籍
    /// </summary>
    class JavaBook : Book
    {
        /// <summary>
        /// 被阅读
        /// </summary>
        public void ByReading()
        {
            Console.WriteLine("我是Java书籍,被在业Java程序员使用。");
        }
    }

虚方法

概念:虚方法有方法体,可以被重写,使用virtual来修饰。父类中的虚方法并非必须被子类重写,在父类中可以给出虚方法的默认实现。如果子类不重写父类的虚方法则依然执行父类的默认实现。如果子类重写了父类的虚方法,则执行子类重写后的方法。其实方法重载也是实现多态的一种形式,只是重载的方法都在同一个类中,而用虚方法实现多态的方法散布在有继承关系的多个类中。

使用:在父类中使用virtual关键字定义虚方法,在子类中使用override关键字来重写父类中的虚方法。

override关键字:通过override关键字来修饰的方法,称为方法的重写。

下面我们用虚方法来改造一下上面的例子

/// <summary>
    /// 演示类
    /// </summary>
    class Demo
    {
        List<Book> books = new List<Book>();

        /// <summary>
        /// 测试
        /// </summary>
        public void Test()
        {
            books.Add(new ComputerBook());
            books.Add(new JavaBook());
            //遍历时不用加判断
            foreach (Book item in books)
            {
                item.ByReading();
            }
        }
    }

    /// <summary>
    /// 书类
    /// </summary>
    class Book
    {
        public virtual void ByReading()
        {

        }
    }

    /// <summary>
    /// 计算机书籍
    /// </summary>
    class ComputerBook : Book
    {
        /// <summary>
        /// 被阅读
        /// </summary>
        public override void ByReading()
        {
            Console.WriteLine("我是计算机类书籍,被在校大学生使用。");
        }
    }

    /// <summary>
    /// Java书籍
    /// </summary>
    class JavaBook : Book
    {
        /// <summary>
        /// 被阅读
        /// </summary>
        public override void ByReading()
        {
            Console.WriteLine("我是Java书籍,被在业Java程序员使用。");
        }
    }

可以看出,使用虚方法来写代码简便了许多。但是问题又来了,一般子类的父类和在父类中的虚方法是“宏观”的,“抽象”的,我们不想让这个父类被实例化并且只提供方法的定义,由子类去实现这个方法,该怎么做呢?如何解决这个问题呢?我们可以使用抽象类和抽象方法来实现。

抽象类和抽象方法

abstract关键字:

       abstract关键字用来修饰抽象类和抽象方法。

抽象类:

    使用abstract关键字修饰的抽象类不能被实例化。

    抽象类中可以有非抽象方法。

    抽象类不能是密封的或者静态的。

抽象方法:

      使用abstract关键字修饰的抽象方法是一个没有实现的方法,由子类重写抽象方法来实现。

    抽象方法没有大括号,直接在小括号后以分号";"结尾。

    含有抽象方法的类必须是抽象类。

    抽象方法必须在其子类中实现,除非它的子类也是抽象类。

下面我们使用抽象类和抽象方法再次改造上面的例子

/// <summary>
    /// 演示类
    /// </summary>
    class Demo
    {
        List<Book> books = new List<Book>();

        /// <summary>
        /// 测试
        /// </summary>
        public void Test()
        {
            books.Add(new ComputerBook());
            books.Add(new JavaBook());
            //遍历时不用加判断
            foreach (Book item in books)
            {
                item.ByReading();
            }
        }
    }

    /// <summary>
    /// 书类
    /// </summary>
    abstract class Book
    {
        public abstract void ByReading();
    }

    /// <summary>
    /// 计算机书籍
    /// </summary>
    class ComputerBook : Book
    {
        /// <summary>
        /// 被阅读
        /// </summary>
        public override void ByReading()
        {
            Console.WriteLine("我是计算机类书籍,被在校大学生使用。");
        }
    }

    /// <summary>
    /// Java书籍
    /// </summary>
    class JavaBook : Book
    {
        /// <summary>
        /// 被阅读
        /// </summary>
        public override void ByReading()
        {
            Console.WriteLine("我是Java书籍,被在业Java程序员使用。");
        }
    }

到了这里,我们可以发现使用虚方法和抽象方法来编程(也就是多态)更符合面向对象编程的思想,并且可以大幅的提升代码的可读性和减少冗余的代码。

用更少的代码实现相同的实现,这感觉,很爽的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值