我是靠谱客的博主 傲娇自行车,最近开发中收集的这篇文章主要介绍设计模式-简单工厂模式前言 简单工厂模式相关定义及结构 自定义简单工厂模式 简单工厂模式的优点和缺点 简单工厂模式在Java中的应用 后记,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
前言
在介绍简单工厂模式之前先介绍介绍
创建模式。
何谓创建模式?
创建模式就是对类的实例化过程的抽象化。通俗的讲,一个系统在创建对象时,需要动态的决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象,创建模式描述了怎样构造和封装这些动态的决定。
创建模式的分类
创建模式分为
类的创建模式和
对象的创建模式。
- 类的创建模式:类的创建模式使用继承关系,把类的创建延迟到子类,从而封装了客户端将得到哪些具体类的信息,并且隐藏了这些类的实例是如何被创建和放在一起的;
- 对象的创建模式:对象的创建模式则把对象的创建过程委派给另外一个对象,从而动态的决定客户端将得到哪些具体类的实例,以及这些类的实例是如何被创建和组合在一起的,典型的应用Spring的beanFactory。
简单工厂模式相关定义及结构
简单工厂模式(Simple Factory)定义
简单工厂模式是类的创建模式,又叫做静态工厂方法模式,它由一个工厂对象决定创建出哪一种产品类的实例。
工厂模式的形态
共舱模式专门负责将大量有共同接口的类实例化,并且可以动态的决定将哪一个类实例化。工厂模式主要有以下几种形态:
- 简单工厂(Simple Factory)模式:又称静态工厂方法模式;
- 工厂方法(Factory Method)模式:又称多态性工程模式或虚拟构造模式;
- 抽象工厂(Abstract Factory)模式:又称工具箱模式。
角色与结构
由上面的类图可以看出,简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一种产品类的实例。简单的工程模式涉及到工厂角色、抽象产品角色以及具体产品角色:
- 工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的业务逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体的Java类实现,举个很简单的例子,guava相信绝大部分人都使用过,针对Collection和Map都采用工厂模式的方式来创建具体的实例,当然java库里多线程部分也有工厂模式的具体使用,详见current包下的Excutors类;
- 抽象产品(Product)角色:担任这个角色的类是由工厂模式所创建的对象的父类或者是它们共同拥有的接口,抽象的产品角色在java中可以是interface或者abstract类;
- 具体产品(Concrete Product)角色:抽象产品的具体实现。
自定义简单工厂模式
只给一个很简单的demo,可以算是一个通用的简单工厂模式的架子。
- 需求:计算四边形面积(两种四边形,正方形和长方形)
- 抽象设计:
- 抽象角色:按照工厂模式的角色,分出各个角色:Creator角色负责创建四边形;抽象四边形角色:具体的四边形(这里只给出正方形和长方形);
- 类图:
- 具体代码实现:
- Creator:
/** * Created by miaomiao on 16/10/28. */ public class Creator { public static Parallelogram factory(float length, float width) { switch(judgeShape(length, width)) { case RECTANGLE: return new Rectangle(length, width); case SQUARE: return new Square(length); } return new Rectangle(length, width); } private static ParallelogramTypeEnum judgeShape(float length, float width) { if (length == width) { return ParallelogramTypeEnum.SQUARE; } else { return ParallelogramTypeEnum.RECTANGLE; } } }
- Parallelogram:
- Parallelogram:
/** * Created by miaomiao on 16/10/28. */ public interface Parallelogram { /** * 计算面积 * @return */ public float calculateArea(); }
- Rectangle:
/** * Created by miaomiao on 16/10/28. */ public class Rectangle implements Parallelogram { private float length = 0f; private float width = 0f; public Rectangle() { } public Rectangle(float length, float width) { this.length = length; this.width = width; } public float calculateArea() { return length * width; } }
- Square:
/** * Created by miaomiao on 16/10/28. */ public class Square implements Parallelogram { private float length; public Square() { } public Square(float length) { this.length = length; } public float calculateArea() { return length * length; } }
- 实际测试:
/** * Created by miaomiao on 16/10/28. */ public class SimpleFactoryPatternTest { @Test public void run() { float length = 5f, width = 3f; float rectangleArea = Creator.factory(length, width).calculateArea(); float squareArea = Creator.factory(length, length).calculateArea(); System.out.println("the area of rectangle is " + rectangleArea); System.out.println("the area of square is " + squareArea); } }
简单工厂模式的优点和缺点
简单工厂模式的优点
简单工程模式的核心是工厂类,这个类一定有必要的逻辑判断,来决定在什么时候创建哪一个产品类的实例。这样子客户端就可以免除直接创建产品的责任,着重关注消费产品。简单工厂模式通过这种做法实现了对责任的分割。
简单工厂模式的缺点
大量的判断逻辑放在了工厂的创建类里,导致这个角色的负担过重,一旦它不能正常的工作,整个系统就会收到影响。同时,它不满足“开-闭”原则。
简单工厂模式在Java中的应用
Java的API中有很多地方都用到了简单工厂模式,比如DateFormat,XMLReaderFactory,Excutors等等,详细源码讲解将会在后文中一次呈现。
后记
跟简单工厂模式相关的一些问答题。
- 大家看书可能都会看到简单工厂模式介绍一开篇就说:工厂模式就是在不使用new操作符的情况下,将类实例化的嘛,为什么看代码的过程中发现仍然使用了new操作符?
答:其实对整个系统来说,工厂模式只是把具体使用new操作符的细节做了一个包装,不把这些细节暴露给调用方。当然,java语言的特征在细节中肯定会有所体现的。
最后
以上就是傲娇自行车为你收集整理的设计模式-简单工厂模式前言 简单工厂模式相关定义及结构 自定义简单工厂模式 简单工厂模式的优点和缺点 简单工厂模式在Java中的应用 后记的全部内容,希望文章能够帮你解决设计模式-简单工厂模式前言 简单工厂模式相关定义及结构 自定义简单工厂模式 简单工厂模式的优点和缺点 简单工厂模式在Java中的应用 后记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复