1、简单工厂简介

诞生背景:在我们平常编程当中,经常会使用new进行实例化一个对象,此时该类完全依赖于该对象,专业术语来说就是耦合度高。当需求发生变化时我们不得不去修改此类的源码,造成整个系统难以维护!然而面向对象(oo)一个很重要的原则(封装变化)就可以解决这样一个问题;那既然要封装变化,自然要找到改变的代码,然后把改变的代码用类进行封装。这样一个思路就引出了简单工厂模式。

定义:简单工厂模式又叫静态工厂模式,顾名思义,它是用来实例化对象类的静态类。

2、简单工厂实例

 /// <summary>
/// 动物抽象类
/// </summary>
public abstract class Animal
{
public abstract void Eat();
public abstract void Call();
} public class Cat : Animal
{ public override void Eat()
{
Console.WriteLine("Fish");
} public override void Call()
{
Console.WriteLine("miao...");
}
} public class Dog : Animal
{ public override void Eat()
{
Console.WriteLine("Shit");
} public override void Call()
{
Console.WriteLine("wang...");
}
}
/// <summary>
/// 简单工厂类
/// </summary>
public class AnimalSimpleFactory
{
public static Animal CreateAnimal(string type)
{
Animal animal = null;
switch (type)
{
case "cat": animal = new Cat(); break;
case "dog": animal = new Dog(); break;
default: break;
}
return animal;
}
}

客户端调用方式:

    static void Main(string[] args)
{
Animal animal = AnimalSimpleFactory.CreateAnimal("dog");
animal.Eat();
animal.Call();
Console.ReadLine();
}

解析:AnimalSimpleFactory中的CreateAnimal方法负责具体Animal的生产,从而降低了对象之间的耦合度;但是,如果我们想要新加一类动物的话,我们还是需要修改工厂类中的代码(新加case语句判断)同样还是违背了OCP原则,同时也会造成工厂类中实现逻辑过于复杂,这也正是简单工厂模式的缺点所在!

3、工厂方法模式

诞生背景:为了解决简单工厂模式还是不能完全满足OCP原则的问题便引发了对工厂方法模式的思考!

实现方式:简单工厂只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式的实现是把具体对象的创建推迟到子类中,此时工厂类不再负责所有对象的创建而是只发出口令把创建对象的过程转交到其子类中;这样再扩展的时候不需要再修改工厂类的逻辑,于是便完全满足了OCP!

4、工厂方法模式实例

  /// <summary>
/// 动物抽象类
/// </summary>
public abstract class Animal
{
public abstract void Eat();
public abstract void Call();
} public class Cat : Animal
{
public override void Eat()
{
Console.WriteLine("Fish");
} public override void Call()
{
Console.WriteLine("miao...");
}
} public class Dog : Animal
{
public override void Eat()
{
Console.WriteLine("Shit");
} public override void Call()
{
Console.WriteLine("wang...");
}
}
/// <summary>
/// 抽象工厂类
/// </summary>
public abstract class AnimalCreater
{
//工厂方法
public abstract Animal CreateAnimal();
} public class CatCreater : AnimalCreater
{
public override Animal CreateAnimal()
{
return new Cat();
}
}
public class DogCreater : AnimalCreater
{
public override Animal CreateAnimal()
{
return new Dog();
}
}

客户端调用方式:

     static void Main(string[] args)
{
AnimalCreater catCreater = new CatCreater();
Animal cat = catCreater.CreateAnimal();
cat.Eat();
cat.Call();
AnimalCreater dogCreater = new DogCreater();
Animal dog = dogCreater.CreateAnimal();
dog.Eat();
dog.Call();
Console.ReadLine();
}

解析:如果要再添加新的动物时,就可以使用多态来实现,对于抽象工厂类和具体对象创建类中的代码都无需做任何改动;我们只需要新定义一个动物类和动物创建类就OK!

5、简单工厂模式与工厂方法模式对比总结

从以上对两种模式的介绍可以了解到,工厂方法模式是为了克服简单工厂模式的缺点(主要是为了满足OCP)而设计出来的。但是,工厂方法模式就一定比简单工厂模式好呢?笔者的答案是不一定 !

1. 结构复杂度
从这个角度比较,显然简单工厂模式要占优。简单工厂模式只需一个工厂类,而工厂方法模式的工厂类随着产品类个数增加而增加,这无疑会使类的个数越来越多,从而增加了结构的复杂程度。

2.代码复杂度
代码复杂度和结构复杂度是一对矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方面肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。

3.客户端编程难度
工厂方法模式虽然满足了OCP,但是在客户端编码中需要对工厂类进行实例化。而简单工厂模式中就是个静态方法,在客户端无需实例化,这无疑是个吸引人的优点。

注:两者各有千秋,仁者见仁,智者见智!

设计模式系列一创建型模式之(简单工厂VS工厂方法)的更多相关文章

  1. Java经典设计模式之五大创建型模式

    转载: Java经典设计模式之五大创建型模式 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种: ...

  2. 设计模式(Java版)-创建型模式之简单工厂模式

    前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...

  3. NET设计模式 第二部分 创建型模式(6):创建型模式专题总结(Creational Pattern)

    创建型模式专题总结(Creational Pattern) ——.NET设计模式系列之七 Terrylee,2006年1月 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统 ...

  4. Java经典设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  5. 初探Java设计模式1:创建型模式(工厂,单例等)

    Java 设计模式 一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混.自认为本文还是写得不错的,花了不少心思来写这文章和做图,力求让读者真的能看着简 ...

  6. Java设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  7. Java设计模式 - 单例模式(创建型模式)

    单例模式我在上学期看一些资料时候学习过,没想到这学期的软件体系结构就有设计模式学习,不过看似篇幅不大,介绍得比较简单,在这里我总结下单例模式,一来整理之前的笔记,二来也算是预习复习课程了. 概述 单例 ...

  8. C++ 设计模式 2:创建型模式

    0 创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活. 1 简单工厂模式 简单 ...

  9. 设计模式(4)-对象创建型模式-Prototype模式

    1.对象创建型模式 1.4          Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...

随机推荐

  1. 判断scrollView的滑动方向

    第一种方式: float lastContentOffset; - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { las ...

  2. Cryptography I 学习笔记 --- 分组密码

    1. 伪随机置换(PRF,Rseudo Random Permutaion)3DES/AES,K*X -> X(a. 可以高效计算,b. PRF函数是一个一一映射的函数,c. 存在有效的逆向算法 ...

  3. 洛谷 P1563 玩具谜题【模拟/环】

    题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时singer告诉 ...

  4. GIT 自动转换行符的案例

    在windows上安装git客户端后, 默认情况下,git clone 项目到Windows本地,git会强制将文件的换行符转成CTRL,而不是LF.我们再次使用git push的时候,换行符又会自动 ...

  5. Delphi 释放数组中的数据

    FillChar(aryTest[Low(aryTest)],    Length(aryTest) * SizeOf(aryTest[Low(aryTest)]), 0);

  6. Python--图像处理(2)

    skimage提供了io模块,顾名思义,这个模块是用来图片输入输出操作的.为了方便练习,也提供一个data模块,里面嵌套了一些示例图片,我们可以直接使用. 引入skimage模块可用: 1 from  ...

  7. SVN merge 三种方式

    1.Merge a range of revisions 2.Reintegrate a branch 3.Merge two different trees ———————————————————— ...

  8. Linux下防火墙iptables用法规则详及其防火墙配置

    转:http://www.linuxidc.com/Linux/2012-08/67952.htm iptables规则 规则--顾名思义就是规矩和原则,和现实生活中的事情是一样的,国有国法,家有家规 ...

  9. 百科知识 国内的创业项目如何众筹,能登录Kickstarter吗

    一个国内的团队登陆Kickstarter到底有多难? 300万用户,4.8亿美元筹款,Kickstarter在2013年交出了一份惊艳的答卷.对于美英澳加新荷六国的创业团队来说,Kickstarter ...

  10. Python 可视化Twitter中指定话题中Tweet的词汇频率

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-8 @author: guaguastd @name: pl ...