目录
工厂模式
引言
在面向对象的编程中,创建一个对象(实例化)主要使用new关键字,工厂模式将类的使用和创建解耦。用户要使用一个类的时候,无需关心该类的具体创建过程,甚至无需知道该类类名,只需要通过工厂类返回需要的实例。就好比我们想吃香蕉,不需要知道香蕉是怎么产生的,不需要我们自己动手种树收获,只需要去水果店买就行(我们可能根本不知道水果店的香蕉是怎么来的)。
定义
英文定义:"Define an interface for creating an object. but let subclasses decide which class to instantiate.Factory Method let a class defer instantiation to subclass."。
在工厂模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,将产品类的实例化操作延迟到工厂子类中去完成。
工厂模式重要等级★★★★★ 工厂模式难度等级★★☆☆☆
工厂模式结构图
工厂模式包含以下角色
1.Factory (抽象产品类)
2.ConcreteFactory (具体产品)
3. Product (抽象产品)
4. ConcreteProduct (具体产品)
实例
实例描述
使用工厂模式创建不同品牌的手机,该实例类图如下:
代码实现
1.Phone 抽象手机类,设计为接口,定义了Play方法。
interface Phone
{
void Play();
}
2.PhoneFactory 手机工厂类,定义工厂方法返回抽象手机
interface PhoneFactory
{
Phone CreatePhone();
}
3.IPhoneX 和HUAWEI具体手机,实现Phone接口
class IphoneX : Phone
{
public void Play()
{
Console.WriteLine("This is IphoneX");
}
}
class HUAWEI : Phone
{
public void Play()
{
Console.WriteLine("This is HUAWEI.");
}
}
4.具体工厂类,实现PhoneFactory接口,返回具体的手机
class IphoneFactory : PhoneFactory
{
public Phone CreatePhone()
{
return new IphoneX();
}
}
class HUAWEIFactory : PhoneFactory
{
public Phone CreatePhone()
{
return new HUAWEI();
}
}
5.测试类,只需要面向Phone和PhoneFactory接口编程。
class Program
{
static void Main(string[] args)
{
PhoneFactory factory;
Phone phone;
//使用苹果工厂生产苹果手机
factory = new IphoneFactory();
phone = factory.CreatePhone();
phone.Play();
//使用华为工厂生产华为手机
factory = new HUAWEIFactory();
phone = factory.CreatePhone();
phone.Play();
Console.ReadKey();
}
}
6.运行结果
工厂模式扩展
静态工厂方法(简单工厂模式)
如果工厂等级结构中只有一个具体工厂类的话,抽象工厂就可以省略,此时,改具体工厂可以创建所有产品对象,那么改工厂的工厂方法可以定义为静态方法,此时,这种工厂模式又称为简单工厂模式。简单工厂模式类图如下。
总结
模式优点
1.在工厂模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪些具体产品将被实例化这一细节,用户只需关系所需产品对应的工厂,无需关心创建细节,甚至无需知道具体产品的类名。
2.在系统中加入新的产品时无需修改原有代码,只需要增加一对工厂和产品,完全符合开闭原则。
模式缺点
1.增加新产品时候,系统中的类将会成对增加,在一定程度上增加了系统的复杂度。