工厂设计模式

  • 三种工厂模式
    • 简单工厂模式(静态工厂模式)
      • 基本介绍
      • 设计方案
    • 工厂方法模式
      • 基本介绍
      • 设计方案
    • 抽象工厂模式
      • 基本介绍
      • 设计思路
  • JDK源码 Calendar类

通过具体的需求

看一个披萨的项目:要便于披萨种类的扩展,要便于维护

  1. 披萨的种类很多(比如 GreekPizz、 CheesePizz 等)
  2. 披萨的制作有 prepare, bake, cut, box
  3. 完成披萨店订购功能。

首先我们如果用传统的方式完成,

我们会用一个OrderPizza.java 类来根据用户输入直接new 对应的pizza ,如下:

 if (ordertype.equals("greek")) {pizza = new GreekPizza();} else if (ordertype.equals("pepper")) {pizza = new PepperPizza();} else if (ordertype.equals("cheese")) {pizza = new CheesePizza();} else {break;}
}

这样如果我们要新增一个Pizza的种类,我们需要 去OrderPizza.java中再加一个 else if, 而且通常情况OrderPizza类不止有一种, 我们新增的时候就要去每个定Pizza的类都加.
因此传统方式是违反了设计模式的ocp原则,即对扩展开放,对修改关闭.即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码

三种工厂模式

软件开发中,当我们会用到大量的创建某种 某类或某批对象时,就会使用工厂模式

  1. 工厂模式的意义
    将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
  2. 三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)
  3. 设计模式的依赖抽象原则
  • 创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。
  • 不要让类继承具体类,而是继承抽象类或者是实现interface(接口)
  • 不要覆盖基类中已经实现的方法。

简单工厂模式(静态工厂模式)

基本介绍

  1. 简单工厂模式属于创建型模型,是工厂模式的一种.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式.
  2. 简单工厂模式定义了一个创建对象的类,由这个类来封装实例化对象的行为

设计方案

  1. 改进思路:简单工厂模式:创建Pizza对象封装到一个类中,这样我们有新的Pizza种类时,只需要修改该类就可, 其它有创建到Pizza对象的代码就不需要修改了


  1. SimplePizzaFactory定义一个可以实例化Pizaa对象的类,封装创建对象的代码
 public class SimplePizzaFactory {public Pizza createPizza(String type) {System.out.println("使用简单工厂模式~~");Pizza pizza = null;if (type.equals("cheese")) {pizza = new CheesePizza();} else if (type.equals("greek")) {pizza = new GreekPizza();} else if (type.equals("pepper")) {pizza = new PepperPizza();return pizza;}}

**这里的createPizza也通常写成静态方法,这样就可以直接调用 **

  1. OrderPizza通过调用SimplePizzaFactory的createPizza 方法来创建相应的Pizza对象
public class OrderPizza {//定义一个简单工厂对象SimpleFactory simpleFactory;Pizza pizza = null;//构造器public OrderPizza(SimpleFactory simpleFactory) {setFactory(simpleFactory);}public void setFactory(SimpleFactory simpleFactory) {String orderType = ""; //用户输入的this.simpleFactory = simpleFactory; //设置简单工厂对象do {orderType = getType(); pizza = this.simpleFactory.createPizza(orderType);//输出pizzaif(pizza != null) { //订购成功pizza.prepare();pizza.bake();pizza.cut();pizza.box();} else {System.out.println(" 订购披萨失败 ");break;}}while(true);}// 写一个方法,可以获取客户希望订购的披萨种类private String getType() {try {BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));System.out.println("input pizza 种类:");String str = strin.readLine();return str;} catch (IOException e) {e.printStackTrace();return "";}}}
  1. 最后调用
//相当于一个客户端,发出订购
public class PizzaStore {public static void main(String[] args) {//使用简单工厂模式new OrderPizza(new SimpleFactory());}}

工厂方法模式

基本介绍

工厂方法模式:定义了一个创建对象的抽象方法**,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。**

设计方案

披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪pizza、北京的胡椒pizza 或者是伦敦的奶酪pizza、 伦敦的胡椒pizza。

工厂方法模式改进的思路:
将披萨项目的实例化功能抽象成抽象方法(OrderPizza),在不同的口味点
餐子类中具体实现(BJOrderPizza\LDOrderPizza)。

  1. 抽象的OrderPizza.java
public abstract class OrderPizza {//定义一个抽象方法,让各个工厂子类自己实现
abstract Pizza createPizza(String ordertype);//构造器
public OrderPizza() {Pizza pizza = null;String ordertype;
do {ordertype = gettype();pizza = createPizza(ordertype);
if (pizza != null) {pizza.prepare();pizza.bake();pizza.cut();pizza.box();
} else {break;
}
} while (true);}}
  1. 实现的工厂子类
public class BJOrderPizza extends OrderPizza {@Override
Pizza createPizza(String type) {Pizza pizza = null;
if (type.equals("cheese")) {pizza = new BJCheesePizza();
} else if (type.equals("pepper")) {pizza = new BJPepperPizza();}return pizza;
}}

抽象工厂模式

基本介绍

  1. 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
  2. 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
  3. 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
  4. 将工厂抽象成两层, AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。 这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

设计思路

  1. AbsFactory接口
public interface AbsFactory {//让不同的工厂类来实现createPizza方法public Pizza createPizza(String type);
}
  1. BJFactory实现
public class BJFactory implements
AbsFactory {@Overridepublic Pizza createPizza(String type) {Pizza pizza = null;if (type.equals("cheese")) {pizza = new BJCheesePizza();} else if (type.equals("pepper")) {pizza = new BJPepperPizza();}return pizza;
}}
  1. OrderPizza 调用AbsFactory接口
public class OrderPizza {AbsFactory factory;
//构造器
public OrderPizza(AbsFactory factory) {setFactory(factory);
}
public void setFactory(AbsFactory factory) {Pizza pizza = null;
String ordertype;
this.factory = factory;
do {ordertype = gettype();
pizza = factory.createPizza(ordertype);
if (pizza != null) {pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {break;}
} while (true);
}}
  1. PizzaStore 传入具体的LDFactory()
public class PizzaStore {public static void main(String[] args) {// new OrderPizza(new BJFactory());
new OrderPizza(new LDFactory());
System.out.println("退出程序~~");
}}

JDK源码 Calendar类

JDK 中的Calendar类中,就使用了简单工厂模式

createCalendar 根据TimeZone\locale 创建对应的实例

【设计模式】工厂设计模式相关推荐

  1. 创建设计模式 - 工厂设计模式

    创建设计模式 - 工厂设计模式 欢迎到工厂设计模式在Java教程.Factory Pattern是Creational Design模式之一,它在JDK以及Spring和Struts等框架中得到广泛应 ...

  2. java二十三种设计模式——工厂设计模式

    java设计模式的分类 在java中,设计模式有三十三种之多,分为三大类: 创建性模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构性模式,共七种:适配器模式.装饰器模式 ...

  3. php设计模式-工厂设计模式

    概念: 工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤. 很多高级模式都是依赖于工厂模式. 转载于:https://www.cnblogs.com/sjhss ...

  4. 嵌入式C设计模式---工厂设计模式

    更新记录链接:嵌入式C设计模式---前言_嵌入式学习_force的博客-CSDN博客_嵌入式前言 目录         1.工厂设计模式动漫详解         2.智慧温室大棚监控系统项目详解工厂应 ...

  5. 设计模式:工厂设计模式

    通过工厂设计模式可降低代码的耦合度.耦合度太高会导致代码不方便维护 就相当于A一直要与B绑定在一起.可以完全参考Java虚拟机的设计思想 程序→JVM→适应不同的操作系统(A->C->B) ...

  6. Java设计模式——工厂设计模式

    工厂设计模式 一.简介 都不知道简介要写什么,工厂模式嘛,就是工厂嘛,生产东西的嘛-- 在Java里面就是用来帮助我们生产对象的咯-- 主要作用嘛,大概就是将创建和使用对象拆分减低耦合度吧. 二.分类 ...

  7. java 生产设计模式_java设计模式-工厂设计模式

    工厂设计模式是创建型设计模式,有三种设计方法:简单工厂(产品父类),工厂模式(工厂父类),抽象工厂(父类接口) 一.简单工厂 简单工厂的设计思想是: 1.定义一个产品的父类 2.具体产品类继承父类 3 ...

  8. 设计模式--工厂设计模式

    工厂设计模式:四个角色 抽象工厂 具体工厂 抽象产品 具体产品 优点:类的创建方法被封装 满足开闭原则 缺点 每增加一个具体产品都要新加一个工厂 会造成类爆炸 package com.qf.facto ...

  9. 设计模式—工厂设计模式

    工厂设计模式 1.概述 2.简单工厂模式 2.1 结构 2.2 实现 2.3 优缺点 2.4 扩展 3.工厂方法模式 3.1 概述 3.2 结构 3.3 实现 3.4 优缺点 4.抽象工厂模式 4.1 ...

  10. Java设计模式-工厂设计模式

    工厂设计模式概念 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工厂模式就相 ...

最新文章

  1. 如何用Python实现超级玛丽的人物行走和碰撞检测?
  2. sql server 2008学习4 设计索引的建议
  3. AtCoder4515 [AGC030F] Permutation and Minimum(dp)
  4. 面向对象:MATLAB的自定义类 [MATLAB]
  5. 【转】如何在eclipse下配置Heritrix
  6. 分享119个Android手机应用源代码总有一个是你想要的
  7. uploadify php demo,php uploadify上传
  8. [乱搞 暴力] BZOJ 1142 [POI2009]Tab
  9. linux系统怎样将图片导出,Linux 下 将PDF文件中的文本,图片导出的方法。
  10. HTML5系列(2)history
  11. 软考倒计时26天,最后冲刺阶段
  12. 陷波滤波器——周期性降噪
  13. javascriptji c z s
  14. 影院体验系列_中国电影博物馆IMAX GT厅_《失控玩家》
  15. 使用对比学习处理大规模多模态单细胞数据
  16. 加盟代理闪云科技小程序为创业者带来另一条出路
  17. 详解pandas的read_csv方法
  18. linux shell ifs,Shell 的 IFS 变量
  19. 苹果的名字测试软件,抖音手机称重是什么软件叫什么名字 怎么用iPhone苹果手机称重...
  20. 软件性能测试方案怎么编写?权威的性能测试报告如何申请?

热门文章

  1. 【数位DP】HDU3555-Bomb
  2. 2022 ICPC网络预选赛第二场 J A Game about Increasing Sequences 歪解
  3. 查看计算机上隐藏用户,Win732位旗舰版系统下如何查看与删除隐藏账户【图】
  4. 登月源码开源登顶GitHub No.1!接而又被中国程序员“玩坏”了
  5. YOLO 对象检测 OpenCV 源代码
  6. 网络客户/服务器程序
  7. win10安装,ERROR:0x8007025D问题解决
  8. FileNotFoundException 问题的解决
  9. Successfully deployed.Backed up previous deployment.
  10. 《十一月的肖邦》——麦芽糖