设计模式 工厂方法模式

工厂方法模式的思路

第一,创建产品规范,也就是产品接口
第二,根据产品规范设计真实的产品,也就是使产品类实现产品接口
第三,结合产品规范,创建工厂规范,也就是工厂接口或者抽象类,产品规范作为工厂中抽象方法(生产线)的参数
第四,根据工厂规范创建工厂,此时工厂可以生产产品了


举一个例子——生产手机

业务需求是,现在和将来一段时间要生产各种型号的手机。
所有的手机都满足手机的规范,比如包含打电话,上网,定位等功能。
现在,小米公司设计了小米手机,苹果公司设计了苹果手机,它们没有手机生产线。
有需求就有人做,富士康有大规模生产加工的经验和能力,它准备建立手机生产线。
只要给手机设计方案,富士康就能够产生出手机。
手机方案是满足手机规范的,工厂根据手机规范建设生产线。
生产线根据手机设计方案生产手机。

手机规范

public interface Phone {/*** 手机介绍自己的功能*/void introduce();
}

手机产品设计方案

小米手机和苹果手机的设计方案

public class XiaomiPhone implements Phone {@Overridepublic void introduce() {System.out.println("i am a xiaomi mobilephone");}
}public class Iphone implements Phone {@Overridepublic void introduce() {System.out.println("i am an iphone.");}
}

工厂规范

定义工厂的规范,工厂有一条手机生产线

public abstract class ExtractPhoneFactory {/*** 手机生产线* @param clazz 手机的设计方案* @param <T> 手机类型* @return 根据该类型手机的设计方案生产出来的手机*/public abstract <T extends Phone> T createPhone(Class<T> clazz);
}

真实的工厂

public class PhoneFactory extends ExtractPhoneFactory {@Overridepublic <T extends Phone> T createPhone(Class<T> clazz) {T phone = null;try{phone = (T)Class.forName(clazz.getName()).newInstance();} catch (Exception e){System.out.println("it goes wrong when creating phone.");}return phone;}
}

生产场景

当前,工厂可以生产小米手机和苹果手机

public class App {public static void main(String[] args){// 实例化工厂ExtractPhoneFactory phoneFactory = new PhoneFactory();// 为工厂的生产线 createPhone 传递一个手机设计方案 XiaomiPhone.classXiaomiPhone mi = phoneFactory.createPhone(XiaomiPhone.class);mi.introduce();Iphone iphone = phoneFactory.createPhone(Iphone.class);iphone.introduce();}
}

新的需求——生产华为手机

public class HuaweiPhone implements Phone {@Overridepublic void introduce() {System.out.println("i am a huawei mobilephone.");}
}

新的生产场景

public class App {public static void main(String[] args){// 实例化工厂ExtractPhoneFactory phoneFactory = new PhoneFactory();// 为工厂的生产线 createPhone 传递一个手机设计方案 XiaomiPhone.classXiaomiPhone mi = phoneFactory.createPhone(XiaomiPhone.class);mi.introduce();Iphone iphone = phoneFactory.createPhone(Iphone.class);iphone.introduce();// 现在增加生产华为手机的业务,只需要创建一个实现了手机接口的手机设计方案类即可HuaweiPhone huawei = phoneFactory.createPhone(HuaweiPhone.class);huawei.introduce();}
}

解释

工厂方法模式命名非常准确。在工厂方法模式中,有两个主体,产品和工厂。
产品一定要满足产品规范,工厂通过产品规范来设计生产线,工厂通过产品设计方案生产产品。
一般地,工厂也需要满足工厂规范。


典型应用

JDBC 连接不同的数据库


为什么需要工厂模式

提高程序的可扩展性,降低程序之间的耦合程度。
比如,已经有一个生产手机的工厂,它可以生产小米手机、苹果手机,
现在工厂接到生产华为手机的订单。怎么办?
工厂只需要华为的手机设计即可,也就是定义一个实现了手机规范的化为手机类即可。


规范的作用

规范,也就是接口,或者是抽象类,
规范是各个模块通信的桥梁。它可以是各个具体模块之间耦合关系降低。


工厂方法模式的弱化——静态工厂模式

简单工厂模式,也就是静态工厂模式
我们省略掉工厂规范,并将实际的工厂类中的方法设置为静态类型,此时就是静态工厂模式。
静态工厂模式的缺点是,工厂类的扩展比较困难。

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

  1. 4. 星际争霸之php设计模式--工厂方法模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  2. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  3. 设计模式 | 工厂方法模式及典型应用

    工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类. 工厂方法模式又简称为工厂 ...

  4. python工厂模式 django_python设计模式-工厂方法模式

    题目:假设你有一个 pizza 店,功能包括下订单.做 pizza,你的代码会如何写呢? def order_pizza(): pizza = Pizza() pizza.prepare() pizz ...

  5. 工厂方法模式_1天1个设计模式——工厂方法模式

    意图 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 问题 假设你正在开发一款物流管理应用.1.0版本只能支持处理卡车运输,因此大部分的代码都位 ...

  6. [设计模式] ------ 工厂方法模式

    工厂方法模式 手机厂造手机,肥皂厂造肥皂,药品厂造药品. 假设有一大类对象A1,A2,A3,A4-他们都有一个共同的父类A A1可以想成是手机,A2可以想成肥皂- (下面例子的A1Factory就是手 ...

  7. JAVA设计模式 - 工厂方法模式

    工厂方法模式(Factory Pattern) 是一种创建型设计模式 , 它是Java中最常用的设计模式之一 . 1 . 工厂方法模式的定义 定义一个创建对象的接口 , 让子类决定实例化哪一个类 . ...

  8. Java设计模式—工厂方法模式抽象工厂模式

    工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...

  9. C#设计模式--工厂方法模式

    0.C#设计模式-简单工厂模式 设计模式: 工厂方法模式(Factory Method Pattern) 介绍:简单工厂模式是要在工厂类中通过数据来做个决策,在工厂类中的多个类中实例化出来其中一个要用 ...

  10. 设计模式 - 工厂方法模式 - 基于 Java 实现

    常见和工厂有关的设计模式 和工厂相关的设计模式主要有三种,工厂方法模式,抽象工厂模式: 在前面的博客中介绍了简单工厂模式,本篇博客主要介绍的是工厂方法模式 什么是工厂方法模式 工厂方法模式是简单工厂的 ...

最新文章

  1. 51单片机中将变量、数组、函数设置在固定位置,定位到绝对地址
  2. http协议报文体_HTTP协议详解
  3. Eclipse下搭建Hadoop开发环境,并运行第一个实例
  4. python安装不了jupyter_求救 python3.8安装jupyter报错无“winpty.h”
  5. 单数据源:spring boot+mybatisplus启动后访问接口报错Invalid bound statement (not found)
  6. 干活|常见WAF拦截页面总结
  7. 邓西百度网盘批量转存检测工具 v1.0.0818
  8. Java笔记9:构造方法,内部类
  9. python自编一个循环计算题_Python练习:循环
  10. 移动web app开发必备 - zepto事件问题
  11. nginx RTMP FFmpeg 视频直播
  12. 数据库db2错误代码大全
  13. 楼道声光控灯闪烁_照明灯闪烁其中一个原因就是它
  14. C++调用ffmpeg批量合并bilibili缓存视频 2.0
  15. 《SteamVR2.2.0快速入门》(Yanlz+Unity+XR+OpenVR+OpenXR+SteamVR+Valve+Vive+Oculus+Quickstart+HMD+立钻哥哥++ok++)
  16. 如何下载Eclipse历史版本
  17. python信用卡客户_银行信用卡客户价值分析(Python数据分析)
  18. 正则表达式给查找到的内容加引号
  19. JAVA学习——Lambda表达式是干什么用的?
  20. 郭天祥自学单片机的方法

热门文章

  1. 兔子的繁殖 【递归算法 数据规模N大于等于1且 N小于等于60】
  2. iOS Cookie在Html中保存,在iOS原生代码端取出。
  3. 虎牙app下载android,虎牙手游直播app下载-虎牙手游 安卓版v3.21.2-PC6安卓网
  4. 如何使用计算机防病毒,如何使用Windows Defender在使用其他防病毒时定期扫描您的计算机 | MOS86...
  5. python网站设计开题报告_网站毕业设计开题报告范文
  6. 旧文备份:FFTW介绍
  7. hdu 4741 Save Labman No.004
  8. 使用GraphInsight打造TuGraph可视化分析应用
  9. 【python+SQLAlchemy】
  10. 【操作系统】多级索引、混合索引例题