工厂模式

一、简单工厂

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

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(); 
    }

}

总结:

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

原文地址:https://www.cnblogs.com/gczr/p/8580802.html