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. Codeforces 746G(构造)

                                                                                                      G. ...

  2. Maven 多模块父子工程 (含Spring Boot示例)

    一.为什么要用Maven多模块 假设有这样一个项目,很常见的Java Web应用.在这个应用中,我们分了几层: Dao Service Web 对应的,在一个项目中,我们会看到一些包名: org.xx ...

  3. Android Gradle 经验总结

    用过android studio的对gradle应该都不陌生了,gradle文件的基本配置大同小异,略做了解使用应该是没什么问题了.但是深入细致的了解一下对于理解项目还是很有帮助的,尤其是遇到一些配置 ...

  4. Scut游戏服务器引擎6.0.5.2发布

    1. 增加C#脚本中能引用多个C#脚本文件的支持2. 修正Web应用程序中使用C#脚本解析不到Bin目录的问题

  5. Ambient Occulution

    SSAO HDAO normal pair 求一个谷 SAO 重建normal HBAO input depth,normal 这几个都是screen space的ao

  6. Performing User-Managed Database-18.7、Performing Complete User-Managed Media Recovery

    18.7.Performing Complete User-Managed Media Recovery 完毕一致性备份,把数据库恢复到当前的scn是最好的结果.能够恢复整个数据库.恢复单个表空间.或 ...

  7. js 模拟发短信

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. mpvue上手

    对于小程序官方编译器,我也不好说什么,不支持scss,不支持emment,一切来说都是不适应 美团mp:http://mpvue.com/mpvue/ vue官方:https://cn.vuejs.o ...

  9. const的理解、const指针、指向const的指针

    1.const 的理解 const 是C语言的一个关键字,需要注意的是,const 关键字是把变量变为一个只读的变量(也就是不可以作为左值),绝对不是将这个变量变为常量.也就是说经过const 修饰的 ...

  10. nightwatch 切换窗口

    .switchWindow() Change focus to another window. The window to change focus to may be specified by it ...