意图:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类(即:工厂子类)。
工厂模式结构图:
工厂模式代码实现
using System;
using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 工厂模式
{ class Program { static void Main(string[] args) { Factory factory = null; Product product = null; while (true) { Console.WriteLine("你想生产Car请按1键,想生产AirPlane请按2键,想生产Tank请按3键"); int num = int.Parse(Console.ReadLine()); switch (num) { case 1: factory = new FactoryCar(); product = factory.produc(); break; case 2: factory = new FactoryAirPlane(); product = factory.produc(); break; case 3: factory = new FactoryTank(); product = factory.produc(); break;default: Console.WriteLine("请按1~3键"); break;
}
}Console.ReadLine();
} public static void print(string str) { Console.WriteLine(str); } }
public abstract class Factory//工厂父类
{ public abstract Product produc();}
public class FactoryCar : Factory//生产Car的工厂
{ public override Product produc() { Console.WriteLine("你生产了一辆车"); return new car(); } }public class FactoryAirPlane : Factory//生产Car的工厂
{ public override Product produc() { Console.WriteLine("你生产了一架飞机"); return new airplane();}
} public class FactoryTank : Factory//生产Tank的工厂 { public override Product produc() { Console.WriteLine("你生产了一辆坦克"); return new Tank(); } } public abstract class Product//产品类 { public abstract string production();//生产产品 }public class car:Product//Car产品
{ public override string production() { return "car"; } }public class airplane:Product//飞机产品
{ public override string production() { return "airplane"; } }public class Tank : Product//坦克产品
{ public override string production() { return "tank"; } } }实现要点
Factory Method模式的两种情况:一是Creator类是一个抽象类且它不提供它所声明的工厂方法的实现;二是Creator是一个具体的类且它提供一个工厂方法的缺省实现。
工厂方法是可以带参数的。
工厂的作用并不仅仅只是创建一个对象,它还可以做对象的初始化,参数的设置等。
功能
用工厂方法在一个类的内部创建对象通常比直接创建对象更灵活。
Factory Method模式通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。
适用类型
在以下情况下,适用于工厂方法模式:
1. 当一个类不知道它所必须创建的对象的类的时候。 2. 当一个类希望由它的子类来指定它所创建的对象的时候。 3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。