简单工厂(SimpleFactory)
概念:
关键字:【多选一】
问题:客户在使用对象时,面临在多个类型中选择一个类创建对象,具体对象的类型可能有变化。
意图:定义一个全局的工厂类,负责类型的选择及对象的创建初始化,从而实现将创建与表示分离。
适用性:
当一个类不知道它所必须创建的对象的类的时候,当类将创建对象的职责委托给一个全局创建点,客户不需要关心具体类型,需要对象的时候,找全局创建点即可。工厂可以根据需要动态创建不同的对象的接口类或方法,这些对象往往有共同的父接口或父类,工厂模式是我们最常用的模式,在大部分程序系统中都在大量运用。
为什么工厂模式是如此常用?
因为工厂模式就相当于创建实例对象的new
1.我们经常要根据类生成实例对象
2.工厂模式也是用来创建实例对象的
使用工厂模式,可能多做一些工作,但会给系统带来更大的复用性和可维护性
工厂模式:
1》工厂方法(Factory Method)
2》抽象工厂(Abstract Factory)
这两个模式:
1.共性:是对象的创建与使用进行了分离
2.不同:
-
工厂方法:一次只能创建一个对象
-
抽象工厂:一次创建一系列相互依赖的对象
工厂方法设计模式
问题【需求,功能】
当需要根据不同的条件产生不同的对象时,
当然这些不同的对象类型不同,却具有共同的父类
解决方案【步骤】
1)创建父类产品以及所有的子类产品
2)创建一个工厂类,在工厂类中定义一个方法即工厂方法
3)实现工厂方法,即根据不同的条件创建并返回不同的对象
优点:
- 工厂依赖于所有的子类产品,工厂是整个模式的核心,以不变应万变
- 工厂方法把创建对象的具体过程封装了,客户只需知道父类产品和工厂即可.
它使对象的创建与使用进行了分离:
- 简化了客户端的应用,也改善了程序的扩展性,
- 使得将来可以做最小的改动就可以加入新的待创建的类.
实现类图
本例以中文命名类名,方法名,是为了便于学习理解,实际工作并不建议编程以中文命名。
示例:
先创建一个接口类型
public interface 饭
{
void 吃到了();
}
创建枚举类型
public enum 饭的类型
{
米饭,
火锅,
面条,
}
再创建接口里的实现类
using System;
public class 火锅 : 饭
{
public void 吃到了()
{
Console.WriteLine("吃到了火锅!");
}
}
using System;
public class 米饭 : 饭
{
public void 吃到了()
{
Console.WriteLine("吃到了米饭!");
}
}
using System;
public class 面条 : 饭
{
public void 吃到了()
{
Console.WriteLine("吃到了面条!");
}
}
创建一个工厂,生成基于给定信息的实体类的对象。
public class 饭店Factory
{
public 饭 吃什么(饭的类型 eat)
{
switch (eat)
{
case 饭的类型.火锅:
return new 火锅();
case 饭的类型.面条:
return new 面条();
case 饭的类型.米饭:
return new 米饭();
}
return null;
}
}
测试示例
using System;
class Program
{
static void Main(string[] args)
{
饭店Factory 饭店 = new 饭店Factory();
饭店.吃什么(饭的类型.火锅).吃到了();
饭店.吃什么(饭的类型.面条).吃到了();
Console.Read();
}
}
输出示例图
设计模式------首页