【设计模式】工厂模式详解

前言

现在大三下期了,正在学习设计模式。

感觉在安卓开发中,有很多地方都可以用到工厂模式。于是写了这篇文档。

为暑假的实习做好准备。(话说我现在还不知道去哪里实习呢T_T)

注意:博主只是个搞安卓的大三学生狗,以下内容纯属自学的,不对其正确性做任何保证。

正文

转载请注明出处: 

发 表 时 间: 2015年3月14日

作 者 信 息: 中北大学 郑海鹏

为什么要有工厂模式

为了便于说明,我们自定义两个概念(和数据库中的类似):

① 操作:单独一个语句的执行。

② 过程:多个操作在一起执行,完成某个特定的任务。

下面是一段引用自网络的解释:

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作.

创建一个String类的对象比较简单,只需要一句话(一个操作)就可以完成。如:String s = new String(“12346”);

但有时候我们创建一个其他类的对象时就比较复杂了。有可能在生成这个复杂对象之前需要生成一些辅助功能的对象。例如:

创建一个人物模型,我们需要先创建好鼻子、眼睛、耳朵、四肢、衣物。即创建一个人物模型时,需要一系列的操作(一个过程)才能完成。如果我们需要在不同的代码段中频繁的创建人物模型时,上述一大段代码可能会到处出现。这不利于往后对代码的修改和维护。

另外,,使用new操作符不符合开闭原则(对扩展开放,对修改封闭)。关于开闭原则,请参考百度百科词条:开闭原则。

因此,使用工厂模式的原因大致有两个:

① 只用一句话就创建一个实例对象,而不用去关心具体创建的过程。

② 降低代码的耦合度,使代码在以后的修改、维护、扩展中更加方便。

初步了解工厂模式的好处如果没有工厂模式

用户想要一台手机,于是自己造了一个cpu、自己造内存、自己造……,最后合在一起造出了手机。

如果有很多个用户想要,那他们都得自己造自己的手机。这浪费了很多的模具,而且效率不高。(非批量化生产)

后来这些用户都要换成iPhone8,于是他们各自又重新造iPhone8的手机部件。

如果有工厂模式

用户想要一台手机,于是告诉工厂“我要手机”。工厂给他一台手机。

如果有多个客户想要手机,工厂都可以给他们。这时,工厂的模具是多次使用的,没有浪费,而且效率较高。(批量化生产)

后来这些用户都要换成iPhone8,于是工厂只重新修改了一次模具,所有的用户都用上了iPhone8。

工厂模式详解简单工厂模式(Simple Factory)什么是简单工厂模式

用户想要手机,不用自己去造手机,只需告诉工厂要什么手机,工厂就给他什么手机。如:

用户1买手机,说:“我要iPhone6 16G版。”工厂给了他16G版;

用户2买手机,说:“我要iPhone6 64G版。”工厂给了他64G版;

用户3买手机,说:“我要iPhone6 128G版。”工厂给了他128G版。

可以理解为:简单工厂模式就是一个switch…case组合,需要根据参数判断返回哪种产品。

代码示例

代码结构:

     

    IPhone6.java

package zhp.factory.简单工厂模式.产品;public abstract class IPhone6 {}

    IPhone6_16G.java    

package zhp.factory.简单工厂模式.产品;public class IPhone6_16G extends IPhone6 {public IPhone6_16G(){System.out.println("创建IPhone6_16G成功!");}}    IPhone6_32G.javapackage zhp.factory.简单工厂模式.产品;public class IPhone6_32G extends IPhone6 {public IPhone6_32G(){System.out.println("创建IPhone6_32G成功!");}}    IPhone6_64G.javapackage zhp.factory.简单工厂模式.产品;public class IPhone6_64G extends IPhone6 {public IPhone6_64G(){System.out.println("创建IPhone6_64G成功!");}}    Factory.javapackage zhp.factory.简单工厂模式.工厂;import zhp.factory.简单工厂模式.产品.IPhone6;import zhp.factory.简单工厂模式.产品.IPhone6_16G;import zhp.factory.简单工厂模式.产品.IPhone6_32G;import zhp.factory.简单工厂模式.产品.IPhone6_64G;public class Factory {public IPhone6 createPhone(String type){switch(type){case "16G":return new IPhone6_16G();case "32G":return new IPhone6_32G();case "64G":return new IPhone6_64G();}return null;}}    Main.javapackage zhp.factory.简单工厂模式;import zhp.factory.简单工厂模式.产品.IPhone6;import zhp.factory.简单工厂模式.工厂.Factory;public class Main {@SuppressWarnings("unused")public static void main(String[] args) {Factory factory = new Factory();IPhone6 iphone16G = factory.createPhone("16G");IPhone6 iphone32G = factory.createPhone("32G");IPhone6 iphone64G = factory.createPhone("64G");}}简单工厂模式的组成

① 一个工厂类:根据不同情况创建不同的手机

② 一个抽象产品类:在这个例子中是iPhone这个大类。在java中一般用抽象类或者接口实现。

③ 多个具体产品类:在这个例子中是iPhone 不同容量的版本。它们都继承/实现了抽象产品类。

工厂方法模式(Factory Method)简单工厂模式的不足

用简单工厂模式时,有100个型号的手机,就有100个case。如果要添加iPhone6 Plus 16G/64G/128G这3个版本,就得再添加3个case。可以看出,简单工厂模式虽然比没有工厂方便,但依然存在如下问题:

① 修改起来还是麻烦,需要在一大堆case中修改;

② 不符合开闭性原则。不方便扩展,也没有对修改封闭。

什么是工厂方法模式

为了解决简单工厂模式的不足,又有了工厂方法模式。

定义:定义一个创建产品对象的抽象工厂,将实际创建工作推迟到抽象工厂的子类当中。

抽象工厂有多个子工厂,每个子工厂只生产一个特定的产品。每当新添加一个产品时,不必去修改之前存在的那些工厂,只需新建一个子工厂就行。这可以使系统在不修改具体工厂角色的情况下引进新的产品。

这样就对修改进行了封闭,同时也保留了扩展性。如图:

微风吹过,海面上金光闪闪,泛起一道道美丽的浪花,

【设计模式】工厂模式详解

相关文章:

你感兴趣的文章:

标签云: