设计模式系列一创建型模式之(简单工厂VS工厂方法)
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工厂方法)的更多相关文章
- Java经典设计模式之五大创建型模式
转载: Java经典设计模式之五大创建型模式 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种: ...
- 设计模式(Java版)-创建型模式之简单工厂模式
前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...
- NET设计模式 第二部分 创建型模式(6):创建型模式专题总结(Creational Pattern)
创建型模式专题总结(Creational Pattern) ——.NET设计模式系列之七 Terrylee,2006年1月 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统 ...
- Java经典设计模式之五大创建型模式(附实例和详解)
一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...
- 初探Java设计模式1:创建型模式(工厂,单例等)
Java 设计模式 一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混.自认为本文还是写得不错的,花了不少心思来写这文章和做图,力求让读者真的能看着简 ...
- Java设计模式之五大创建型模式(附实例和详解)
一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...
- Java设计模式 - 单例模式(创建型模式)
单例模式我在上学期看一些资料时候学习过,没想到这学期的软件体系结构就有设计模式学习,不过看似篇幅不大,介绍得比较简单,在这里我总结下单例模式,一来整理之前的笔记,二来也算是预习复习课程了. 概述 单例 ...
- C++ 设计模式 2:创建型模式
0 创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活. 1 简单工厂模式 简单 ...
- 设计模式(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) - ...
随机推荐
- 自做CA自签发SSL证书
一.把证书准备好.步骤与使用OpenSSL自签发服务器https证书所述大同小异.在这里再重复一次.1.制作CA证书:ca.key CA私钥: openssl genrsa -des3 -out ca ...
- ASP.NET MVC生成静态页面
1.先付上封装好生成静态页的原代码: public class Common { #region 获取模板页的Html代码 /// <summary> /// 获取页面的Html代码 // ...
- Write a function that generates one of 3 numbers according to given probabilities
You are given a function rand(a, b) which generates equiprobable random numbers between [a, b] inclu ...
- java JIT AOT
作者:ETIN链接:https://zhuanlan.zhihu.com/p/27393316来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. I guess anyon ...
- 在网页里插入flash的代码
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://down ...
- MATLAB逻辑函数
%%逻辑函数 %%all:判断是否有元素非0,A是多维矩阵,all(A)是以列为单位来处理的,当前列的逻辑 %值为1,当且仅当当前列的每一个元素都非0 A=[1,2,3;0,2,1;5,0,2]; % ...
- SilverLight.3-Validation:二、银光验证。TheLabel、TheDescriptionViewer和TheValidationSummary
ylbtech-SilverLight.3-DataControls_BetterDataFroms:二.银光验证.TheLabel.TheDescriptionViewer和TheValidatio ...
- window.location.href重定向 不会触发webview
通过window.location.href来重定向的,安卓不会触发shouldOverrideUrlLoading.
- Vue 渲染优先级
当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级.
- MySql(四):备份与恢复
一.数据库备份使用场景 下面我就列举一下我个人理解的我们能够需要用到数据库备份的一些比较常见的情况吧. a.数据丢失应用场景 1.人为操作失误造成某些数据被误操作:2.软件BUG 造成数据部分或者全部 ...