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. CCCC L2-003. 月饼[贪心/类似hdu贪心老鼠]

    L2-003. 月饼 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不 ...

  2. CentOS6.6升级openssl到1.0.2a

    如果安装的CentOS不是完整版,需要安装下面几个安装包 安装wget: yum -y install wget 安装Perl: yum install perl* 安装gcc: yum instal ...

  3. Azure CDN 服务详解

    Azure CDN概述   Azure CDN(内容分发网络)是一种用于分发高带宽内容的全球CDN解决方案,它可以托管在Azure中,也可以通过在任何其他位置,借助Azure CDN,可以托管到任何其 ...

  4. luogu P1651 塔

    题目描述 小明很喜欢摆积木,现在他正在玩的积木是由N个木块组成的,他想用这些木块搭出两座高度相同的塔,一座塔的高度是搭建它的所有木块的高度和,并且一座塔至少要用一个木块.每个木块只能用一次,也可以不用 ...

  5. spring配置文件中配置sessionFactory失败

    配置失败主要原因有两个: <bean id="studentDaoImp" class="com.gxwuz.maven.dao.StudentDaoImp&quo ...

  6. 转:浅析Collections.sort

    浅析Collections.sort 问题引入   在之前的一次Java上机实习中,老师布置了一道很简单的题: 从控制台输入10个整数,对它们进行升序排序并输出.   考虑到只有10个数,需要比较的次 ...

  7. Debugging that latch timeout

    https://troubleshootingsql.com/tag/stack-dump/ Book on Azure and SQL Server

  8. Autolayout 01

    Auto Layout Concepts auto layout的基本概念是constraint(约束).表示了你interface中的layout元素.例如,你可以创建一个约束来指定元素的宽度或者距 ...

  9. LAN、WAN、WLAN的区别

    听语音 浏览:22034 | 更新:2015-06-22 20:10 | 标签:网线 1 2 3 4 5 6 7 分步阅读 好多朋友在群内问我路由器如何配置,本来还耐心解答,但是他竟然连LAN.WAN ...

  10. HDU1087上升子序列的最大和

     解法一 此题是一个简单的动态规划问题,用dp[i]记做最后一步经过第i个数所得到的最大sum值,则结果=max(dp[i]),i=1,...n.考虑dp[i]的前一步会经过那里?假设dp[i]的前一 ...