简单工厂模式:又叫静态工厂方法(Static Factory Method)模式,严瑾的说,简单工厂模式不算设计模式中的一种,之所以拿出来说是因为有很多模式都是从简单工厂模式衍生过去的,所以先来介绍一下简单工厂模式,方便为介绍其他模式的时候做铺垫,这是小编尝试着用生活中的例子来介绍,如有不恰当之处,希望大家在评论中给出,如果觉得不错,请记得为小编点个赞,谢谢~。
简单工厂模式的UML类图如下:
对于初学者来说,看到这个模式就立马和小伙伴们都惊呆了,WTF,这是什么鬼怎么看出它是简单工厂的,然后这是干嘛的呢?不过在小编这篇博客中,这些你都不用担心,小编会给读者慢慢全部道来。
小编比较喜欢开车,所以对车方面非常感兴趣,这次小编就用宝马汽车举个例子,如下图:
这个应该比上面那个好看一些了吧,并不是结构变了,而是将它化了个“装”,既然看到类图了,那么例子也应当举出来,是吧!如下,先有一家工厂:
有了这个工厂之后,就说明在这个工厂中能够生产出这四款宝马车型,这个时候就有客户来看车型,销售人员将各款车的性能、加速度、前后驱动、乘坐舒适度、价格等等一切考量车性价比的因素给介绍完成之后,然后客户根据自己的需求和用处,找到一台最好看的买下,于是通知工厂生产出一台客户想要的。代码在下文中慢慢介绍:
首先:车子的各方面信息需要实现准备好,那样销售人员好给客户介绍,这个时候就需要建立一个属性类,如下:
Private Product _宝马五系 = 0 ; //定义属性
Private Product _宝马X6 = 0 ;
Private Product _宝马I8 = 0;
Private Product _宝马Z4 = 0;
Public Product宝马五系 //定义宝马五系的属性
{
get{return _宝马五系;}
set{_宝马五系 = value;}
}
Public Product 宝马X6 //定义宝马X6的属性
{
get{return _宝马X6;}
set{_宝马X6 = value;}
}
Public Product 宝马I8 //定义宝马I8的属性
{
get{return _宝马I8;}
set{_宝马I8 = value;}
}
Public Product 宝马Z4 //定义宝马Z4的属性
{
get{return _宝马Z4;}
set{_宝马Z4 = value;}
}
其次,这是一个宝马工厂,所以必须要有一个工厂来生产产品,所以这个时候就需要建立一个工厂类:
Public class BMWFactory
{
Public static Production createOperate(string Product)
{
Production Prod = null;
Switch (Product)
{
case "宝马五系" :
Prod = new 宝马五系();
Break ;
case "宝马X6" :
Prod = new 宝马X6();
Break ;
case "宝马I8" :
Prod = new 宝马I8();
Break ;
case "宝马Z4" :
Prod = new 宝马Z4();
Break ;
}
Return Prod ;
}
}
这个时候工厂和汽车的属性都有了,那么客户就可以选择汽车了,所以针对客户这方面的代码是:
Production Car ;
Car = BMWFactory . createOperate("宝马I8");
String result = Prod.GetResult();
最后,销售人员来客户买好制订的汽车之后立即通知工厂给客户生产,工厂也应当将所生产出来的汽车信息显示给客户知道,所以就有了如下这些代码:
class Production 宝马五系:BWM
{
public override Product GetResult()
{
result String;
result = Console.ReadLine();
Console.WriteLine("生产宝马五系汽车{0}台",result)
}
}
class Production 宝马X6:BWM
{
public override Product GetResult()
{
result String;
result = Console.ReadLine();
Console.WriteLine("生产宝马X6汽车{0}台",result)
}
}
class Production 宝马I8:BWM
{
public override Product GetResult()
{
result String;
result = Console.ReadLine();
Console.WriteLine("生产宝马I8汽车{0}台",result)
}
}
class Production 宝马Z4:BWM
{
public override Product GetResult()
{
result String;
result = Console.ReadLine();
Console.WriteLine("生产宝马Z4汽车{0}台",result)
}
}
这就是简单工厂的所有代码。
简单工厂模式的核心是:客户需要什么,就给工厂传去需要什么的信息,工厂在接收到需求的信息之后立马生产,然后生产出来客户所需要的产品之后立马通知客户。就是这么一个过程。
简单工厂的优点:工厂类是整个模式的关键,包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建那个具体类的对象,通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费者”就可以了,而不必管这些对象究竟如何创建及如何组织的,明确了各自的职责和权利,有利于整个软件体系结构的优化。
简单工厂模式的缺点,由于工厂类集中了所有实力的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中,他所能创建的类只能是先考虑的,如果需要添加新的类,则就需要改变工厂类。当系统中的具体产品不断增多时候,可能会出现要求工厂类根据不同条件创建不同势力的需求,这种对条件的判断和具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利,于是针对这些缺点,真正的设计模式:工厂方法模式就出来了,详情请见博主下一篇博客:设计模式之工厂方法模式。