c# 设计模式 之:工厂模式之---简单工厂
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 = 0, JeepCarType = 1, HatchbackCarType = 2 } /// <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的高内聚的责任分配原则