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

模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和复杂过程呢?

解决方案:建立一个工厂来创建对象

实现:

一、引言
    1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用。
    2)简单工厂模式:后来出现工业革命。用户不用去创建宝马车。因为客户有一个工厂来帮他创建宝马.想要什么车,这个工厂就可以建。比如想要320i系列车。工厂就创建这个系列的车。即工厂可以创建产品。
    3)工厂方法模式时代:为了满足客户,宝马车系列越来越多,如320i,523i,30li等系列一个工厂无法创建所有的宝马系列。于是由单独分出来多个具体的工厂。每个具体工厂创建一种系列。即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象。你需要指定某个具体的工厂才能生产车出来。

4)抽象工厂模式时代:随着客户的要求越来越高,宝马车必须配置空调。于是这个工厂开始生产宝马车和需要的空调。

最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。而不用自己去创建523i空调车宝马车.

这就是工厂模式。

二、分类 
        工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。 
工厂模式可以分为三类:

1)简单工厂模式(Simple Factory) 
2)工厂方法模式(Factory Method) 
3)抽象工厂模式(Abstract Factory)

这三种模式从上到下逐步抽象,并且更具一般性。 
        GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。

将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

三、区别 
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类可以创建多个具体产品类的实例。   
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
两者皆可。

四、简单工厂模式 
建立一个工厂(一个函数或一个类方法)来制造新的对象。
分布说明引子:从无到有。客户自己创建宝马车,然后拿来用。

[java] view plaincopy print?
  1. public class BMW320 {
  2. public BMW320(){
  3. System.out.println("制造-->BMW320");
  4. }
  5. }
  6. public class BMW523 {
  7. public BMW523(){
  8. System.out.println("制造-->BMW523");
  9. }
  10. }
  11. public class Customer {
  12. public static void main(String[] args) {
  13. BMW320 bmw320 = new BMW320();
  14. BMW523 bmw523 = new BMW523();
  15. }
  16. }

客户需要知道怎么去创建一款车,客户和车就紧密耦合在一起了.为了降低耦合,就出现了工厂类,把创建宝马的操作细节都放到了工厂里面去,客户直接使用工厂的创建工厂方法,传入想要的宝马车型号就行了,而不必去知道创建的细节.这就是工业革命了:简单工厂模式

即我们建立一个工厂类方法来制造新的对象。如图:

产品类:

[java] view plaincopy print?
  1. abstract class BMW {
  2. public BMW(){
  3. }
  4. }
  5. public class BMW320 extends BMW {
  6. public BMW320() {
  7. System.out.println("制造-->BMW320");
  8. }
  9. }
  10. public class BMW523 extends BMW{
  11. public BMW523(){
  12. System.out.println("制造-->BMW523");
  13. }
  14. }

工厂类:

[java] view plaincopy print?
  1. public class Factory {
  2. public BMW createBMW(int type) {
  3. switch (type) {
  4. case 320:
  5. return new BMW320();
  6. case 523:
  7. return new BMW523();
  8. default:
  9. break;
  10. }
  11. return null;
  12. }
  13. }

客户类:

[java] view plaincopy print?
  1. public class Customer {
  2. public static void main(String[] args) {
  3. Factory factory = new Factory();
  4. BMW bmw320 = factory.createBMW(320);
  5. BMW bmw523 = factory.createBMW(523);
  6. }
  7. }

简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。 
      先来看看它的组成: 
         1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品
         2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。         
         3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。 
        
        下面我们从开闭原则(对扩展开放;对修改封闭)上来分析下简单工厂模式。当客户不再满足现有的车型号的时候,想要一种速度快的新型车,只要这种车符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。所以对产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一种新型车,都要在工厂类中增加相应的创建业务逻辑(createBMW(int type)方法需要新增case),这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类,我们称它为全能类或者上帝类。 
        我们举的例子是最简单的情况,而在实际应用中,很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝累坏了,也累坏了我们这些程序员。
        于是工厂方法模式作为救世主出现了。 工厂类定义成了接口,而每新增的车种类型,就增加该车种类型对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码。
五、工厂方法模式 
        工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。 
工厂方法模式组成: 
       1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 
       2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。 
       3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。 
       4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。 
       工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有 的代码。可以看出工厂角色的结构也是符合开闭原则的!

代码如下:

产品类:

[java] view plaincopy print?
  1. abstract class BMW {
  2. public BMW(){
  3. }
  4. }
  5. public class BMW320 extends BMW {
  6. public BMW320() {
  7. System.out.println("制造-->BMW320");
  8. }
  9. }
  10. public class BMW523 extends BMW{
  11. public BMW523(){
  12. System.out.println("制造-->BMW523");
  13. }
  14. }

创建工厂类:

[java] view plaincopy print?
  1. interface FactoryBMW {
  2. BMW createBMW();
  3. }
  4. public class FactoryBMW320 implements FactoryBMW{
  5. @Override
  6. public BMW320 createBMW() {
  7. return new BMW320();
  8. }
  9. }
  10. public class FactoryBMW523 implements FactoryBMW {
  11. @Override
  12. public BMW523 createBMW() {
  13. return new BMW523();
  14. }
  15. }

客户类:

[java] view plaincopy print?
  1. public class Customer {
  2. public static void main(String[] args) {
  3. FactoryBMW320 factoryBMW320 = new FactoryBMW320();
  4. BMW320 bmw320 = factoryBMW320.createBMW();
  5. FactoryBMW523 factoryBMW523 = new FactoryBMW523();
  6. BMW523 bmw523 = factoryBMW523.createBMW();
  7. }
  8. }

工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。

参考http://blog.csdn.net/hguisu/article/details/7505909

以上就是简单工厂模式,工厂方法模式,抽象工厂模式在这里。

作者:jason0539

微博:http://weibo.com/2553717707

博客:http://blog.csdn.net/jason0539(转载请说明出处)

转载于:https://www.cnblogs.com/telwanggs/p/6780857.html

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)相关推荐

  1. Java设计模式(二)简单工厂模式—设计模式六大原则

    文章目录 设计模式六大原则 1. 开闭原则 2. 里氏代换原则 3. 依赖倒转原则 4. 接口隔离原则 5. 迪米特法则(最少知道原则) 6. 合成复用原则 工厂设计模式 什么是工厂模式 工厂模式的好 ...

  2. 初学 Java 设计模式(三):实战抽象工厂方法模式 「QQ 厘米秀装扮」

    一.抽象工厂方法模式介绍 1. 解决的问题 通过接口的选择,解决在系统产品存在多个产品族,而系统仅消费某一族的产品的问题. 2. 定义 抽象工厂模式是一个围绕超级工厂创建其他工厂的模式,即抽象工厂是一 ...

  3. JAVA设计模式是个什么玩意儿_02_抽象工厂模式

    1. 定义 2. 思路 抽象工厂模式是工厂方法模式的进一步抽象,为创建一组相关或相互依赖的对象提供一个接口,无需指定它们的具体类.抽象工厂通常用于创一族产品,并且这组产品分不同的等级,不同的工厂生产不 ...

  4. java修改文件名_Java实现简单修改文件名的方法分析

    本文实例讲述了Java实现简单修改文件名的方法.分享给大家供大家参考,具体如下: 今天帮朋些个网站,做到商品上传的时候需要给文件重新设置名称,以前也做过类的功能,只是没有保存忘了,为了避免以后再重新找 ...

  5. JAVA设计模式Design Pattern→单例模式Singleton Pattern、工厂模式Factory Pattern、代理模式Proxy Pattern

    私有化构造函数的类可以提供相应的 "接口"(一般就是静态方法)来返回自己的唯一实例供外部调用,像这样的确保只生成一个实例的模式被称作单例模式. 工厂模式,一个模型,用来大规模的生产 ...

  6. Java设计模式之从[暗黑破坏神存档点]分析备忘录(Memento)模式

    在大部分游戏中,都有一个"存档点"的概念.比如,在挑战boss前,游戏会在某个地方存档,假设玩家挑战boss失败,则会从这个存档点開始又一次游戏.因此,我们能够将这个"存 ...

  7. Java设计模式,行为型(一)(策略模式,命令模式)

    策略模式(Strategy) 策略模式用来分离算法的实现,类比与if-else:通过上下文对实现进行管理. 约束接口: public interface IPay {void pay(Context ...

  8. java 设计模式之 观察者模式 发布订阅(Publisher/Subscribe)模式

    interface Subject {//通知人void setAction(String action);void attach(Observer observer);void detach(Obs ...

  9. 类代理java设计模式---动态代理(简单笔记)

    最近研究类代理,稍微总结一下,以后继续补充: 所谓态动代理类是在运行时生成的class,在生成它时,你必须供给一组interface给它,则态动代理类就称宣它实现了这些interface.当然,态动代 ...

  10. java继承与覆盖_简单的继承,方法重载与方法覆盖

    [java]代码库package com.jiarui; public class Demo1 { public static void main(String[] args) { Dog dog1= ...

最新文章

  1. byte数组穿换成pcm格式_Apache Arrow:一种适合异构大数据系统的内存列存数据格式标准...
  2. C++面试知识点总结
  3. early z optimization
  4. windows下的NTP服务
  5. Linux 普通用户拿到root权限及使用szrz命令上传下载文件
  6. linux下编译jrtplib-3.9.1
  7. LeetCode 496. 下一个更大元素 I(哈希)
  8. android.content.res.Resources$NotFoundException: String resource ID XXXX
  9. Windows x64平台 获取PEB表,并获取kernel32.dll的基址,并获取它的函数
  10. rsync 使用小记
  11. ASP.NET 中处理客户端数字证书
  12. CSS中常见中文字体的英文名称
  13. 图解HTTP读书笔记
  14. Mac模拟器进行远程调试
  15. ES2015中let的暂时性死区(TDZ)
  16. FFmpeg 音视频截取
  17. android 语音识别
  18. 项目管理大会演讲PPT
  19. delphi负数变正数_Delphi Format 格式化数字
  20. 关于双字节字符(16 byte)

热门文章

  1. (36)Verilog HDL关系运算:大于、小于、等于
  2. cesium 局部加载_cesium自定义气泡窗口infoWindow后续优化篇 - GIS之家
  3. MQTT onenet 使用记录
  4. linux设置程序循环,linux shell编程学习笔记(7)流程控制之循环结构
  5. Keil MDK详细讲解
  6. 数据结构与算法分析(一)——C++文件读写+py文件读写
  7. s3c6410 nand初始化
  8. 总结-最全linux工具的使用
  9. java复习系列[1] - Java 基础
  10. ML、DL、CNN学习记录2