【设计模式】 工厂方法模式
设计模式 工厂方法模式
工厂方法模式的思路
第一,创建产品规范,也就是产品接口
第二,根据产品规范设计真实的产品,也就是使产品类实现产品接口
第三,结合产品规范,创建工厂规范,也就是工厂接口或者抽象类,产品规范作为工厂中抽象方法(生产线)的参数
第四,根据工厂规范创建工厂,此时工厂可以生产产品了
举一个例子——生产手机
业务需求是,现在和将来一段时间要生产各种型号的手机。
所有的手机都满足手机的规范,比如包含打电话,上网,定位等功能。
现在,小米公司设计了小米手机,苹果公司设计了苹果手机,它们没有手机生产线。
有需求就有人做,富士康有大规模生产加工的经验和能力,它准备建立手机生产线。
只要给手机设计方案,富士康就能够产生出手机。
手机方案是满足手机规范的,工厂根据手机规范建设生产线。
生产线根据手机设计方案生产手机。
手机规范
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 连接不同的数据库
为什么需要工厂模式
提高程序的可扩展性,降低程序之间的耦合程度。
比如,已经有一个生产手机的工厂,它可以生产小米手机、苹果手机,
现在工厂接到生产华为手机的订单。怎么办?
工厂只需要华为的手机设计即可,也就是定义一个实现了手机规范的化为手机类即可。
规范的作用
规范,也就是接口,或者是抽象类,
规范是各个模块通信的桥梁。它可以是各个具体模块之间耦合关系降低。
工厂方法模式的弱化——静态工厂模式
简单工厂模式,也就是静态工厂模式
我们省略掉工厂规范,并将实际的工厂类中的方法设置为静态类型,此时就是静态工厂模式。
静态工厂模式的缺点是,工厂类的扩展比较困难。
【设计模式】 工厂方法模式相关推荐
- 4. 星际争霸之php设计模式--工厂方法模式
题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...
- java 工厂方法_java设计模式-工厂方法模式
1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...
- 设计模式 | 工厂方法模式及典型应用
工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类. 工厂方法模式又简称为工厂 ...
- python工厂模式 django_python设计模式-工厂方法模式
题目:假设你有一个 pizza 店,功能包括下订单.做 pizza,你的代码会如何写呢? def order_pizza(): pizza = Pizza() pizza.prepare() pizz ...
- 工厂方法模式_1天1个设计模式——工厂方法模式
意图 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 问题 假设你正在开发一款物流管理应用.1.0版本只能支持处理卡车运输,因此大部分的代码都位 ...
- [设计模式] ------ 工厂方法模式
工厂方法模式 手机厂造手机,肥皂厂造肥皂,药品厂造药品. 假设有一大类对象A1,A2,A3,A4-他们都有一个共同的父类A A1可以想成是手机,A2可以想成肥皂- (下面例子的A1Factory就是手 ...
- JAVA设计模式 - 工厂方法模式
工厂方法模式(Factory Pattern) 是一种创建型设计模式 , 它是Java中最常用的设计模式之一 . 1 . 工厂方法模式的定义 定义一个创建对象的接口 , 让子类决定实例化哪一个类 . ...
- Java设计模式—工厂方法模式抽象工厂模式
工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式. 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...
- C#设计模式--工厂方法模式
0.C#设计模式-简单工厂模式 设计模式: 工厂方法模式(Factory Method Pattern) 介绍:简单工厂模式是要在工厂类中通过数据来做个决策,在工厂类中的多个类中实例化出来其中一个要用 ...
- 设计模式 - 工厂方法模式 - 基于 Java 实现
常见和工厂有关的设计模式 和工厂相关的设计模式主要有三种,工厂方法模式,抽象工厂模式: 在前面的博客中介绍了简单工厂模式,本篇博客主要介绍的是工厂方法模式 什么是工厂方法模式 工厂方法模式是简单工厂的 ...
最新文章
- 51单片机中将变量、数组、函数设置在固定位置,定位到绝对地址
- http协议报文体_HTTP协议详解
- Eclipse下搭建Hadoop开发环境,并运行第一个实例
- python安装不了jupyter_求救 python3.8安装jupyter报错无“winpty.h”
- 单数据源:spring boot+mybatisplus启动后访问接口报错Invalid bound statement (not found)
- 干活|常见WAF拦截页面总结
- 邓西百度网盘批量转存检测工具 v1.0.0818
- Java笔记9:构造方法,内部类
- python自编一个循环计算题_Python练习:循环
- 移动web app开发必备 - zepto事件问题
- nginx RTMP FFmpeg 视频直播
- 数据库db2错误代码大全
- 楼道声光控灯闪烁_照明灯闪烁其中一个原因就是它
- C++调用ffmpeg批量合并bilibili缓存视频 2.0
- 《SteamVR2.2.0快速入门》(Yanlz+Unity+XR+OpenVR+OpenXR+SteamVR+Valve+Vive+Oculus+Quickstart+HMD+立钻哥哥++ok++)
- 如何下载Eclipse历史版本
- python信用卡客户_银行信用卡客户价值分析(Python数据分析)
- 正则表达式给查找到的内容加引号
- JAVA学习——Lambda表达式是干什么用的?
- 郭天祥自学单片机的方法
热门文章
- 兔子的繁殖 【递归算法 数据规模N大于等于1且 N小于等于60】
- iOS Cookie在Html中保存,在iOS原生代码端取出。
- 虎牙app下载android,虎牙手游直播app下载-虎牙手游 安卓版v3.21.2-PC6安卓网
- 如何使用计算机防病毒,如何使用Windows Defender在使用其他防病毒时定期扫描您的计算机 | MOS86...
- python网站设计开题报告_网站毕业设计开题报告范文
- 旧文备份:FFTW介绍
- hdu 4741 Save Labman No.004
- 使用GraphInsight打造TuGraph可视化分析应用
- 【python+SQLAlchemy】
- 【操作系统】多级索引、混合索引例题