文章目录

  • 一、工厂设计模式
  • 二、工厂设计模式详解
    • 1.简单工厂模式
    • 2. 工厂方法模式
    • 3. 抽象工厂模式
  • 总结

一、工厂设计模式

工厂模式就类比实际生活中的工厂,在实际生活中,用户从来不会关系一个物品的详细制造过程,只会直接购买最终的成品。工厂设计模式的出发点也是如此。不同的是,现在要站在工厂的角度来进行考虑问题。工厂模式可以分为简单工厂模式工厂方法模式抽象工厂模式

二、工厂设计模式详解

1.简单工厂模式

简单工厂模式,就是直接根据传递的参数进行实际对象的创建,代码示例如下:

public class SimpleFactory {/*** @author yongrenyue* @param name* @return* @throws ClassNotFoundException*/public Food create(String name) throws ClassNotFoundException {switch (name){case "cookie":return new Cookie(name);case "bread":return new Bread(name);default:throw new ClassNotFoundException("Factory can not produce!");}}
}

可能会有人问,这跟直接new一个对象的区别不就是简单的封装了一下吗,感觉反而复杂了。但是不要忘记,实际场景下,新建一个对象可能会有依赖,代码示例如下:

public class SimpleFactory2 {/*** @author yongrenyue* @param name* @return* @throws ClassNotFoundException*/public Food create(String name) throws ClassNotFoundException {switch (name){case "noodles":Flour flour = new Flour("yongrenyue", 231);Oil oil = new Oil("yongrenyue", 123);return new Noodles("lanzhou" , flour, oil);case "steamedbread":Flour flo = new Flour("yongrenyue", 231);return new SteamedBread(name, flo);default:throw new ClassNotFoundException("Factory can not produce!");}}
}

这种情况下,创建noodles对象需要flour和oil对象,而创建steamedbread需要flour对象。如果自己创建这两个对象的话,创建1个还可以接受,如果创建100个呢?是不是对工厂模式有了一点点体会。
但是这种简单的工厂模式有很大弊端,如果后期要增加新的对象,则必须要修改SimpleFactory类。而且随着要创建对象的增加,工厂类也会变得越来越庞大。设计模式中的开闭原则要求对修改封闭,对扩展开发,这很明显违反了这个原则。因此又有了以下工厂方法模式和抽象工厂方法模式。

2. 工厂方法模式

上面的简单工厂方法模式是一个工厂可以创建所有对象,但是对于有新增对象的场景并不友好,显式的违反了开闭原则。而工厂方法模式则是削弱工厂的能力,对要创建的每个对象都新建一个工厂类,即从什么对象都可以创建的工厂转变为专一的工厂,noodles工厂只生成noodles,而bread工厂只生产bread。代码示例如下:

//Noodles Factory
public class NoodlesFactory {public Noodles createFactory(){Flour fo = new Flour("yongrenyue", 123);Oil oil = new Oil("yongrenyue", 321);return new Noodles("lanzhou", fo, oil);}
}
//Bread Factory
public class BreadFactory {public Bread crateBread(String name){return new Bread("yongrenyue");}
}

使用时首先创建一个要生产对象的工厂实例,然后即可通过对应的工厂创建对应的对象。工厂方法模式主要解决的问题就是简单工厂违反的开闭原则。如果要新增种类,只需要创建对应的工厂类,而不需要修改已有的工厂类,很好的符合了开闭原则。工厂方法模式使用示例如下:

public static void main(String[] args) throws ClassNotFoundException {//FactoryMethod demoNoodlesFactory noodleFactory = new NoodlesFactory();noodleFactory.createNoodles().show();System.out.println("--------------------------------------");BreadFactory breadFactory = new BreadFactory();breadFactory.crateBread().show();}

3. 抽象工厂模式

抽象工厂模式则是在工厂方法模式上的进一步抽象,提取出Factory接口,然后通过实现接口实现对应的工厂。

public interface Factory {Food create();
}public class CookieFactory implements Factory{@Overridepublic Food create() {return new Cookie("yongrenyue");}
}public class SteamedBreadFactory implements Factory{@Overridepublic Food create() {return new SteamedBread("yongrenyue", new Flour("yongrenyue", 123));}
}

使用时:

public static void main(String[] args) throws ClassNotFoundException {//FactoryMethod demoFactory factory = new SteamedBreadFactory();factory.create().show();System.out.println("--------------------------------------");factory = new CookieFactory();factory.create().show();}

抽象工厂在工厂方法模式的基础上又进行了一层抽象,所以在使用的时候更加方便,顶层接口都是相同的,可以很方便的替换创建对象的工厂。但是抽象工厂也有缺点,如果工厂接口需要增加新的功能,则同时需要修改接口以及所有实现该接口的工厂。所以抽象工厂适用于同类工厂的横向扩展。


总结

以上就是创建型设计模式中的工厂模式,涉及到的代码:https://gitee.com/yongrenyue/design-pattern。
如有错误,恳请大家批评指正,日拱一卒,功不唐捐。

创建型设计模式之工厂模式相关推荐

  1. 创建型设计模式——抽象工厂模式

    1.什么是抽象工厂模式? 抽象工厂模式:  定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类. 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合. 从设计层面看,抽 ...

  2. 每天学习一个设计模式(八):创建型之抽象工厂模式

    目录 一.基本概念 二.通俗解释 三.应用场景 1.使用简单工厂模式的解决方案 2.抽象工厂模式 抽象工厂模式结构 在什么情况下应当使用抽象工厂模式 抽象工厂模式的起源 四.抽象工厂模式的优缺点 抽象 ...

  3. 创建型设计模式之建造者模式(Builder)

    结构 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用性 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 当构造过程必须允许被构造的对象有不 ...

  4. Java创建型设计模式——建造者模式

    文章目录 1.0概念理解 2.0编码理解 2.1编码说明 2.2编码实现 五种创建型设计模式:工厂方法模式.抽象工厂模式.建造者模式.原型模式.单例模式 1.0概念理解 ​ ​ 一句话理解:建造者模式 ...

  5. java设计模式之创建型设计模式

    创建型设计模式: 抽象工厂(Abstract Factory): 用途:提供一个接口以创建一系列相关或相互依赖的对象,而无需指定具体的类. 场景: 一个系统要独立于它的产品的创建. 一个系统要由多个产 ...

  6. 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)

    创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...

  7. 二、java设计模式之工厂方法+抽象工厂模式(创建型设计模式)

    创建型设计模式-工厂模式和应用 工厂模式介绍: 它提供了一种创建对象的最佳方式,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 例子: 需要购买一辆车,不用管 ...

  8. 创建型设计模式-----原型模式(浅克隆、深克隆)

    目录 简介 为什么用克隆 浅克隆 深克隆 序列化实现深拷贝 应用场景 今天讲创建型设计模式中的原型模式,大家可以从标题中略微猜测一下,这个原型模式是个什么东东. 简介 定义:用原型实例创建对象的种类, ...

  9. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

最新文章

  1. Python3 try-except、raise和assert解析
  2. Android的第一个程序
  3. 微软的搜索引擎挺不错的
  4. duilib vs2015 安装_FFmpeg视频播放器开发-FFmpeg简介与项目环境搭建(一)
  5. linux内核2.6.35编译过程
  6. 扩展欧几里得算法(求逆元)总结
  7. Java实现基于Socket的pbft算法
  8. [2019CCPC秦皇岛] G Game on Chessboard 状压dp
  9. web前端开发师前景,96道前端面试题
  10. 说说 Bootstrap 表格样式
  11. Spring学习-初识Spring
  12. iOS横屏电子签名上篇【核心原理: 旋转特定的屏幕 Quartz2D】应用场景:采集电子签名,支持签名界面为横屏其余页面都是竖屏、清除重写、灵活控制提示语信息、以及查看商户协议等
  13. OpenShift 4 - 在单节点 OpenShift 上部署 ODF 存储软件
  14. android起始页面与导航页面
  15. 【weJudge】1109. [ACM]呐,你想成为什么颜色呢?
  16. html中div被挤下来,css+div左右布局没效果,右边的被挤到底部_html/css_WEB-ITnose
  17. 国内代码托管中心-码云
  18. JavaScript零基础入门--笔记动力节点最新老杜(九-完结)全套笔记精髓
  19. vue cli 3 升级到 vue cli 4 方法步骤及升级点总结
  20. 计算机课程教学与计算科学

热门文章

  1. 巴菲特、索罗斯的投资名言
  2. 计算机专业的毕业证照片,拿到毕业证发朋友圈的句子 晒毕业照片的说说
  3. 标准开道,金融业灾备阔步向前
  4. 白银现货行情的影响因素
  5. css公用样式文件,CSS公用样式.doc
  6. 婴儿摇铃玩具亚马逊审查要求做CPC认证标准要求
  7. ZooKeeper watch机制核心讲解
  8. 解决戴尔电脑win10无法正常关机现象
  9. 3DSlicer中查看形变场
  10. 空间搜索引擎:Censys