设计模式C#描述之——简单工厂模式
### 设计模式C#描述之——简单工厂模式 #### 知识点概述 简单工厂模式是一种常用的设计模式,属于创建型模式之一。该模式的主要目的是为了封装产品对象的创建过程,将这一过程从客户端分离出来,使客户端无须关心具体的产品类如何被实例化。在C#中应用简单工厂模式,可以有效地降低系统的耦合度,提高代码的可扩展性和可维护性。 #### 模式详解 简单工厂模式的核心在于存在一个拥有创建各种实例方法的工厂类。在这个模式中,客户端只需调用工厂类中的方法,并传递相应的参数即可获取所需的产品实例。这种方式避免了在客户端代码中直接使用`new`操作符来创建对象,从而减少了客户端对具体产品类的依赖。 #### 核心概念解析 - **产品接口**:定义了所有产品的共同行为。本例中`Fruit`接口定义了`grow()`、`harvest()`和`plant()`三个方法。 - **具体产品类**:实现了产品接口的具体行为。例如,`Apple`类和`Strawberry`类分别实现了`Fruit`接口中定义的方法。 - **工厂类**:负责根据传入的信息选择合适的具体产品类进行实例化。`FruitGardener`类作为工厂类,通过静态方法`factory(string which)`来决定创建哪种类型的水果对象。 - **客户端**:通过调用工厂类提供的方法获取具体产品对象,并调用其方法完成相应功能。`Client`类扮演客户端角色,通过`FruitGardener.factory`方法获取不同类型的水果对象并执行相关操作。 #### 实现分析 1. **接口定义**:首先定义了一个抽象或接口类型`Fruit`,该类型包含了所有水果共有的方法签名。这些方法描述了水果的基本行为,如生长、收获和种植等。 2. **具体产品实现**: - `Apple`类继承自`Fruit`接口,实现了接口中定义的所有方法,用于描述苹果的具体行为。 - `Strawberry`类同样继承自`Fruit`接口,实现了接口中定义的所有方法,用于描述草莓的具体行为。 3. **工厂类实现**: - `FruitGardener`类作为工厂类,提供了一个静态方法`factory`,该方法接受一个字符串参数`which`,根据该参数返回不同的`Fruit`类型实例。 - 如果`which`为"Apple",则返回`Apple`类的新实例;如果`which`为"Strawberry",则返回`Strawberry`类的新实例;否则返回`null`。 4. **客户端使用**: - 在`Client`类中,客户端通过调用`FruitGardener.factory`方法获取指定类型的`Fruit`对象,并进一步调用对象的方法来完成特定的操作,如生长、收获和种植等。 #### 优缺点分析 - **优点**: - **封装性好**:客户端无需了解具体产品的创建细节,只需知道工厂类提供的方法即可。 - **易于扩展**:当系统中需要增加新的产品时,只需添加新的具体产品类,并在工厂类中进行相应的扩展,客户端代码无须改动。 - **灵活性高**:通过参数化的方式控制产品对象的创建,使得系统更加灵活多变。 - **缺点**: - **违反开闭原则**:当系统中需要新增一种产品时,需要修改工厂类中的逻辑,这可能导致工厂类变得臃肿复杂。 - **过度依赖于工厂类**:所有的产品对象都由工厂类负责创建,一旦工厂类出现问题,整个系统都会受到影响。 #### 总结 简单工厂模式通过将产品对象的创建封装到一个工厂类中,有效地降低了客户端与具体产品类之间的耦合度,提高了系统的灵活性和可扩展性。然而,随着产品种类的增加,工厂类可能会变得越来越复杂,因此在实际应用中需要注意适度使用,并结合其他设计模式来优化系统的结构和性能。
前言:
设计模式是软件开发领域的精髓之一。学好设计模式是目前每一个开发人员的必修课。目前关于设计模式的书很多,其中比较好的有GOF那本的中译本,但并不很适合初学者。还有一本是《JAVA与模式》,比较适合初学者使用,在此强烈推荐。但这本书的不足之处是一些地方讲的过于繁琐,很多地方只须简单说明一下即可,却大费笔墨,使得书籍很厚,看起来费力。而且是用JAVA描述的,这使得一些只懂C"的人无从下手。我是一个.net的拥护者,为了看这本书我特意看了些JAVA的书,感觉JAVA在书籍的多样性方面比 .net好很多,而且不少书籍的质量很高。可能是现在JAVA已经比较成熟的原因吧。为了方便.net的爱好者学习设计模式,在此把我学习《JAVA与模式》这本书的学习笔记发出来,并用C"语言重新描述,希望能对初学者有所帮助。
其实设计模式也并不是什么高深的理论,个人认为并不是象一些人所说的“没写过10万代码就不要谈设计模式”,只要用心学习与实践是完全能够掌握的。
简单工厂模式是类的创建模式,又叫做静态工厂方法模式。就是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例。一般涉及到三种角色
工厂类:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体的类实现。
抽象产品角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或她们共同拥有的接口。一般由接口或抽象类实现。
具体产品角色:工厂方法模式所创建的任何对
象都是这个角色的实例,由具体类实现。
简单工厂模式优缺点:
模式的核心是工厂类,这个类负责产品的创建,而客户端可以免去产品创建的责任,这实现了责任的分割。但由于工厂类集中了所有产品创建逻辑的,如果不能正常工作的话会对系统造成很大的影响。如果增加新产品必须修改工厂角色的源码。
以园丁种植水果为例讨论该模式的具体实现:
Fruit 水果接口,规定水果具有的一些共同特性
Apple 苹果类 派生自Fruit接口
Strawberry 草莓类 派生自Fruit接口
FruitGardener 园丁类 负责草莓与苹果的创建工作。
当Client要创建水果(苹果或草莓对象)的时候调用园丁类的factory方法创建
代码如下:
Fruit.cs
namespace Simple_Factory
{
public interface Fruit
{
//生长
void grow();
- 粉丝: 6
- 资源: 33
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip
- (源码)基于Android的饭店点菜系统.zip
- (源码)基于Android平台的权限管理系统.zip
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip