前言

之前介绍了设计模式的原则和分类等概述。今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍。

简单工厂模式

做法:创建一个工厂(方法或类)用来制造对象。

当一个人想要用手机的时候,需要自己创建手机然后来使用。

如下:

public class IphoneX {

    public IphoneX(){
System.out.println("##### 制造iphoneX #####");
}
}
public class Iphone8 {

    public Iphone8(){
System.out.printf("##### 制造iphone8 #####");
} }
public class Customer {

    /**
* 使用手机
*/
@Test
public void usePhone(){
IphoneX iphoneX = new IphoneX();
Iphone8 iphone8 = new Iphone8();
} }

这种实现方式,客户在使用的手机的时候会看到手机的具体实现方式,客户就和手机的耦合度非常高,其实客户并不关心手机具体是什么实现的,为了降低耦合,就出现了工厂类,把手机的制造过程放到工厂里去实现。客户想使用手机时,将手机型号传递给工厂类里创建手机的方法就可以了。而不必关心手机制造的整个过程,这样一来在创建手机的过程中添加额外的一些操作也显得很灵活。这种实现方式就是下面要介绍的简单工厂模式

public abstract class Iphone {
public Iphone(){ }
}
public class IphoneX extends Iphone{

    public IphoneX(){
System.out.println("##### 制造iphoneX #####");
}
}
public class Iphone8 extends Iphone{

    public Iphone8(){
System.out.printf("##### 制造iphone8 #####");
}
}

工厂类:

public class FoxconnFactory {

    /**
* 创建手机
* @param model 型号
* @return
*/
public static Iphone createIphone(String model){ switch (model){
case "X":{
return new IphoneX();
}
case "8":{
return new Iphone8();
}
default:break;
}
return null;
}
}

客户类:

public class Customer {

    /**
* 使用手机
*/
@Test
public void usePhone(){
Iphone iphoneX = FoxconnFactory.createIphone("X");
     Iphone iphone8 = FoxconnFactory.createIphone("8");
  }
}

简单工厂模式的类图如下:

这个类图上包含三个角色:

  • 工厂类角色(Factory):这是本模式的核心,含有一定的商业逻辑和判断逻辑。在Java中往往由一个具体类实现。
  • 抽象产品角色(Abstract Iphone Class):一般是具体产品继承的父类或者实现的接口,在Java中由一个具体类来实现。
  • 具体产品角色(IphoneX):工厂类所创建的对象就是此角色的实例,在Java中由一个具体类来实现。

在实际情况中如果我们想使用新的型号的手机,就需要改造FoxconnFactory这个类(在类中加case)这违背了开闭原则,因为在使用新产品的时候,工厂类是属于被动改变的。为了解决这种情况,就出现了工厂方法模式,工厂方法模式与简单工厂模式的最大不同在于,简单工厂模式只有一个(对于一个项目或一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。

工厂方法模式提供了多个实现相同接口的工厂类,这样每个工厂类生产不同类型的产品,这样如果新增加一款手机只需要新增加一个生产此款手机的工厂类就可以了,不用去改变已经存在的工厂类。这样就符合开闭原则了。

例子如下:

public abstract class Iphone {
public Iphone(){ }
}
public class IphoneX extends Iphone{

    public IphoneX(){
System.out.println("##### 制造iphoneX #####");
}
}
public class Iphone8 extends Iphone{

    public Iphone8(){
System.out.printf("##### 制造iphone8 #####");
}
}

工厂类:

public interface Factory {

    Iphone createIphone();

}
public class FoxconnFactory implements Factory{

    /**
* 创建iphoneX手机
* @return
*/
@Override
public Iphone createIphone(){ return new IphoneX();
}
}
public class HeShuoFactory implements Factory {

    /**
* 生产iphone8手机
* @return
*/
@Override
public Iphone createIphone() { return new Iphone8();
}
}

客户类:

public class Customer {

    /**
* 使用手机
*/
@Test
public void usePhone(){ Factory foxconn = new FoxconnFactory();
Factory heshuo = new HeShuoFactory(); Iphone iphoneX = foxconn.createIphone();
Iphone iphone8 = heshuo.createIphone();
} }

工厂方法模式结构图如下:

此结构图的中含四个角色:

  • 抽象工厂角色(代加工工厂):这是工厂方法模式的核心,它与应用程序无关,是具体工厂角色必须实现的接口或者必须继承的父类。在Java中他由抽象类或者接口来实现。
  • 具体工厂角色(富士康工厂):它含有与具体业务逻辑有关的代码。由应用程序调用,以创建对应的具体产品对象。在Java中它由具体类来实现。
  • 抽象产品角色(苹果手机抽象类):它是具体产品继承父类或者是实现的接口。在Java中一般有抽象类或接口来实现。
  • 具体产品角色(iphoneX手机):具体工厂角色所创建的对象就是此角色的实例。在Java中由具体的类来实现。

虽然说工厂方法模式解决了简单工厂模式的不满足开闭原则的问题,但是这也造成了,代码量的成本增加,当产品数量过多时,维护起来会很麻烦,反而简单工厂没有这么麻烦,当多个产品需要修改时,简单工厂模式仍然只需要修改唯一的工厂类。无论哪种方式都是以实现功能为目的。

对比一下得出个人结论:简单工厂模式,更简洁方便。工厂方法模式更松散,更先进。

Java设计模式学习记录-简单工厂模式、工厂方法模式的更多相关文章

  1. Java设计模式学习记录-享元模式

    前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了).享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存损耗. 享 ...

  2. Java设计模式学习记录-备忘录模式

    前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...

  3. Java设计模式学习记录-迭代器模式

    前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...

  4. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  5. Java设计模式学习记录-命令模式

    前言 这次要介绍的是命令模式,这也是一种行为型模式.最近反正没有面试机会我就写博客呗,该投的简历都投了.然后就继续看书,其实看书也会给自己带来成就感,原来以前不明白的东西,书上已经给彻底的介绍清楚了, ...

  6. Java设计模式学习记录-外观模式

    前言 这次要介绍的是外观模式(也称为门面模式),外观模式也属于结构型模式,其实外观模式还是非常好理解的,简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可以不必关系具体执行了哪些业务,而只 ...

  7. Java设计模式学习记录-模板方法模式

    前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...

  8. Java设计模式学习记录-状态模式

    前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...

  9. Java设计模式学习记录-桥接模式

    前言 这次介绍结构型设计模式中的第二种模式,桥接模式. 使用桥接模式的目的就是为了解耦,松散的耦合更利于扩展,但是会增加相应的代码量和设计难度. 桥接模式 桥接模式是为了将抽象化与实现化解耦,让二者可 ...

随机推荐

  1. ajax点击加载更多图片

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  2. bootstrap 警告框多个删除

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  3. django天天生鲜项目

    .后台admin管理天天生鲜商品信息 models里 from django.db import modelsfrom tinymce.models import HTMLField #需要pip安装 ...

  4. Git和SourceTree配合使用

    Git介绍 git是当今最强大的本地的分布式代码版本管理工具. git的核心概念与操作:开发环境,本地仓库,远程仓库.他们的关系如下图: 与CVS及SVN的比较: CVS及SVN都是集中式的版本控制系 ...

  5. AngularJS $scope 继承性 作用 生命周期

    一.基本概念 作用域是一个指向应用模型的对象,相当于MVVM中的ViewModel,能绑定数据(属性)和行为(方法),能监控表达式和传递事件,是实现双向绑定的基础,是应用在 HTML (视图) 和 J ...

  6. unidbgrid单元格操作

    unidbgrid单元格操作 //GRID里回车替换TABfunction cellkeydown(sender, td, cellIndex, record, tr, rowIndex, e, eO ...

  7. [NewCoder 3] 二维数组中的查找

    题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.   来分析下,假设在数 ...

  8. Python 学习第二章

    本章内容 数据类型 数据运算 表达式 if ...else 语句 表达式 for 循环 表达式 while 循环 一.数据类型 在内存中存储的数据可以有多种类型. 在 Python 有五个标准的数据类 ...

  9. MVC所有的ActionResult

    一.所有的Controller都继承自System.Web.Mvc.Controller 目前ASP.NET MVC3默认提供了多种ActionResult的实现,在System.Web.Mvc命名空 ...

  10. C#实时检测端口占用情况

    在TCP/IP协议中,服务端需要去监听客户端的端口,开始监听,我们需要检测使用的端口是否被占用,获取系统当前使用的所有端口号,用此端口进行匹配即可. 代码如下 internal static Bool ...