• 工厂模式


    一、简单工厂

    专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

    public interface ICar 
    { 
        void run(); 
    } 
    
    public class BMWCar : ICar 
    { 
        public void run() 
        { 
            Console.WriteLine("BMWCar run"); 
        } 
    } 
    
    public class BenzCar : ICar 
    { 
        public void run() 
        { 
            Console.WriteLine("BenzCar run"); 
        } 
    } 
    public class Driver 
    { 
        public static ICar DriverCar(string carType) 
        { 
            switch (carType) 
            { 
                case "BMWCar": return new BMWCar(); 
                case "BenzCar": return new BenzCar(); 
                default: throw new Exception(); 
           } 
        } 
    } 
    
    public class Client 
    { 
        public static void Main() 
        { 
            ICar myCar = Driver.DriverCar("BenzCar"); 
            myCar.run(); 
            Console.Read(); 
        } 

    优点只要实现共有的接口就可以实现不同车跑的方式.
    缺点:添加新车型,需要修改Driver 类

    二、工厂方法

    工厂方法模式是对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类或者接口),这个类将不在负责具体的产品生产,而是制定一些规范,具体的生产工作由其子类去完成。

    using System; 
    public interface ICar 
    { 
        void run(); 
    } 
    
    public class BMWCar : ICar 
    { 
        public void run() 
        { 
            Console.WriteLine("BMWCar run"); 
        } 
    } 
    
    public class BenzCar : ICar 
    { 
        public void run() 
        { 
            Console.WriteLine("BenzCar run"); 
        } 
    } 
    
    public abstract class Driver 
    { 
        public abstract ICar DriverCar(); 
    } 
    
    public class BMWDriver : Driver 
    { 
        public override ICar  DriverCar() 
        { 
            return new BMWCar(); 
        } 
    } 
    
    public class BenzDriver : Driver 
    { 
        public  override ICar DriverCar() 
        { 
            return new BenzCar(); 
        } 
    } 
    
    class Client 
    { 
        public static void Main() 
        { 
            Driver myDriver = new BenzDriver(); 
            ICar myCar = myDriver.DriverCar(); 
            myCar.run(); 
            Console.Read(); 
        } 
    }

    该模式的优点是符合了开放-封闭原则(OCP),能够任意增加新的具体产品类。

    三、抽象工厂方法

    有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例

    using System; 
    
    public interface IBusinessCar 
    { 
        void run(); 
    } 
    
    public interface ISportCar 
    { 
    void run(); 
    } 
    
    public class BMWBusinessCar : IBusinessCar 
    { 
        public void run() 
        { 
            Console.WriteLine("BMWCar run"); 
        } 
    }
    public class BenzBusinessCar : IBusinessCar 
    { 
        public void run() 
        { 
            Console.WriteLine("BenzBusinessCar run"); 
        } 
    } 
    
    public class BMWSportCar:ISportCar 
    { 
    public void run() 
    { 
    Console.WriteLine("BMWSportCar run"); 
    } 
    } 
    
    public class BenzSportCar:ISportCar 
    { 
    public void run() 
    { 
    Console.WriteLine("BenzSportCar run"); 
    } 
    } 
    
    public interface IDriver 
    { 
    IBusinessCar BusinessCarDriver(); 
    ISportCar SportCarDriver(); 
    } 
    
    public class BMWDriver:IDriver 
    { 
    
    public IBusinessCar BusinessCarDriver() 
    { 
    return new BMWBusinessCar(); 
    } 
    
    public ISportCar SportCarDriver() 
    { 
    return new BMWSportCar(); 
    } 
    } 
    
    public class BenzDriver:IDriver 
    { 
    public IBusinessCar BusinessCarDriver() 
    { 
    return new BenzBusinessCar(); 
        } 
    
    public ISportCar SportCarDriver() 
    { 
    return new BenzSportCar(); 
    } 
    }
    
    class Client 
    { 
        public static void Main() 
        { 
            IDriver myDriver =new BenzDriver(); 
            ISportCar myCar = myDriver.SportCarDriver(); 
            myCar.run(); 
            Console.Read(); 
        }
    
    }

    总结:

      工厂方法只有一个抽象产品类,而抽象工厂可以有多个。  
      工厂方法的具体工厂类只创建一个具体产品类的实例,而抽象工厂的具体工厂可以创建多个。
      重点:模式的条条框框区别都是次要的,最重要的是领悟思想、结合实际、活用规则!

  • 相关阅读:
    Input 银行卡验证
    记一次坑爹的加解密问题
    C# Html Agility Pack
    记一次坑爹的 “跨域” 问题
    FindControl的使用方法
    C#如何使用异步编程
    ReportViewer中设置ServerReport.ReportServerCredentials属性的方法
    C#中常用接口介绍
    谈谈C#中的接口
    DataTable与Linq相互转换
  • 原文地址:https://www.cnblogs.com/gczr/p/8580802.html
Copyright © 2020-2023  润新知