Unity设计模式---开放封闭原则---2

34 阅读2分钟

开放--封闭原则

开放封闭原则定义

一个软件实体应当对扩展开放,对修改关闭,也就是说在设计一个模块的时候,应当使这个模块
在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。

举例:软件实体,如类、模块、功能等,应当对扩展开放,但是对修改关闭。即一个现有工程完毕后,
之后所有新添加的功能应当在不修改原有代码的基础上进行,不应当在已有代码上进行任何代码的修改,
或者逻辑上修改添加操作。

注意:不允许更改系统的抽象层,允许更改系统的实现层。

开放封闭原则分析

1.在开闭原则中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。
2.其中,抽象性是开闭原则的关键。
3.开闭原则可通过一个更加具体的“对可变性封装原则”来描述,对可变性封装原则要求找到系统的
可变因素并将其封装起来。

我们需要在开发工作开始不久就知道可能发生的变化,查明可能发生的变化所等待的时间越
长,要创建正确的抽象就越困难,开闭原则是面向对象设计的核心所在。
遵循开闭原则使程序可维护、可扩展、可复用,灵活性好。开发人员仅对程序中呈现出频繁变化的
部分做出抽象。拒绝刻意抽象,不成熟抽象,防止物极必反。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 开闭原则
{
    public interface Fruit
    {
        void Plant();
        void Blossom();
        void Outcome();
    };

    public class Apple : Fruit
    {
        public Apple() 
        { 
            this.Plant();
        }
        public void Blossom()
        {
            Console.WriteLine("种一棵苹果树");
        }

        public void Outcome()
        {
            Console.WriteLine("苹果树开花");
        }

        public void Plant()
        {
            Console.WriteLine("苹果收获了");
        }
    }

    public class Pear : Fruit
    {
        public Pear() { }
        public void Blossom()
        {
            Console.WriteLine("种一棵梨树");
        }

        public void Outcome()
        {
            Console.WriteLine("梨树开花");
        }

        public void Plant()
        {
            Console.WriteLine("梨树收获了");
        }
    }

    public interface GardenBase 
    { 
        Fruit GetFruit();
    }

    public class AppleGarden : GardenBase
    {
        private static AppleGarden appleGardenSingleton;
        private AppleGarden() { }
        public static AppleGarden GetAppleGarden() 
        {
            if (appleGardenSingleton == null)
            { 
                appleGardenSingleton= new AppleGarden();
            }
            return appleGardenSingleton;
        }

        public Fruit GetFruit()
        {
            return new Apple();
        }
    }

    public class PearGarden : GardenBase
    {
        private static PearGarden pearGardenSingleton;
        private PearGarden() { }
        public static PearGarden GetPearGarden()
        {
            if (pearGardenSingleton == null)
            {
                pearGardenSingleton = new PearGarden();
            }
            return pearGardenSingleton;
        }

        public Fruit GetFruit()
        {
            return new Apple();
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            Fruit tempApple;
            GardenBase appleGarden=AppleGarden.GetAppleGarden();
            tempApple=appleGarden.GetFruit();

            Fruit tempPear;
            GardenBase pearGarden = PearGarden.GetPearGarden();
            tempPear = appleGarden.GetFruit();
        }
    }
}