1、uml类图如下:

具体实现和依赖关系:

实现:SportCar、JeepCar、HatchbackCar 实现 Icar接口

依赖:

Factory依赖 SportCar、JeepCar、HatchbackCar

Client依赖:Icar接口和Factory类

2、具体实现:

抽象产品类代码:

namespace CNBlogs.DesignPattern.Common
{
/// <summary>
/// 抽象产品类: 汽车
/// </summary>
public interface ICar
{
void GetCar();
}
}

具体产品类代码:

namespace CNBlogs.DesignPattern.Common
{
public enum CarType
{
SportCarType = ,
JeepCarType = ,
HatchbackCarType =
} /// <summary>
/// 具体产品类: 跑车
/// </summary>
public class SportCar : ICar
{
public void GetCar()
{
Console.WriteLine("场务把跑车交给范·迪塞尔");
}
} /// <summary>
/// 具体产品类: 越野车
/// </summary>
public class JeepCar : ICar
{
public void GetCar()
{
Console.WriteLine("场务把越野车交给范·迪塞尔");
}
} /// <summary>
/// 具体产品类: 两箱车
/// </summary>
public class HatchbackCar : ICar
{
public void GetCar()
{
Console.WriteLine("场务把两箱车交给范·迪塞尔");
}
}
}

简单工厂核心代码:

namespace CNBlogs.DesignPattern.Common
{
public class Factory
{
public ICar GetCar(CarType carType)
{
switch (carType)
{
case CarType.SportCarType:
return new SportCar();
case CarType.JeepCarType:
return new JeepCar();
case CarType.HatchbackCarType:
return new HatchbackCar();
default:
throw new Exception("爱上一匹野马,可我的家里没有草原. 你走吧!");
}
}
}
}

客户端调用代码:

//------------------------------------------------------------------------------
// <copyright file="Program.cs" company="CNBlogs Corporation">
// Copyright (C) 2015-2016 All Rights Reserved
// 原博文地址: http://www.cnblogs.com/toutou/
// 作 者: 请叫我头头哥
// </copyright>
//------------------------------------------------------------------------------
namespace CNBlogs.DesignPattern
{
using System;
using CNBlogs.DesignPattern.Common; class Program
{
static void Main(string[] args)
{
ICar car;
try
{
Factory factory = new Factory(); Console.WriteLine("范·迪塞尔下一场戏开跑车。");
car = factory.GetCar(CarType.SportCarType);
car.GetCar();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
  • 优点:简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
  • 缺点:很明显工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则

最新文章

  1. Excel2013 基本用法(上)
  2. ListMultimap 容器
  3. 将Sql Server迁移到Always on集群 - 账号的同步
  4. Oracle procedure存储过程/function函数
  5. ORA-00214: control file 控制文件版本不一致
  6. SolrCloud初识
  7. Webkit之HTML解析
  8. CRS-2800 CRS-4000
  9. Java虚拟机学习 - 体系结构 内存模型(1)
  10. iOS日历中给一个事件加入多个提醒
  11. js获取某个日期所在周周一的日期
  12. idea-全局默认maven配置
  13. Leetcode 17.——Letter Combinations of a Phone Number
  14. iOS 中的类属性
  15. 基于ZigBee模块与51单片机之间的简化智能家居项目简介(学生版本)
  16. jQuery each和js forEach用法比较
  17. echarts4的学习
  18. PHP判断是否都是中文
  19. C语言中的随意跳转
  20. beego + websocket 向页面推送数据

热门文章

  1. c#正则表达式--环视
  2. Mac休眠之后唤醒时无法使用鼠标
  3. TortoiseGit学习系列之Windows上TortoiseGit的安装详解(图文)
  4. mysql exceeded the &#39;max_questions&#39; resource 记录
  5. Steps to install Docker on Manjaro 16.10--转
  6. WPF中Window的ShowInTaskbar、Owner和Topmost属性
  7. java几个经典的算法题目----------二维矩阵算法
  8. C++中文件流操作
  9. 推荐网站 explainshell.com
  10. 基于node安装gulp-一些命令