设计模式二: 工厂方法(Factory Method)
简介
工厂方法模式是创建型模式的一种, 核心结构有四个角色: 抽象工厂,具体工厂,抽象产品,具体产品;
实现层面上,该模式定义一个创建产品的接口,将实际创建工作推迟到具体工厂类实现, 一个产品对应一个工厂, 这样的好处是当有新产品引入时可以不修改具体的工厂角色.
意图
定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。
类图
实现
以汽车举例. 按照本模式核心的四个角色分别定义, 并增加模式调用角色(此处顺便提一下简单工厂模式, 比较简单, 具体实现参看代码).
- 抽象产品, 定义接口
Car
/**
* 汽车接口
*/
public interface Car {
/**
* 开车
*/
void run();
}
- 抽象工厂
CarFactory
/**
* 汽车工厂接口
*/
public interface CarFactory {
/**
* 生产汽车
* @return 实现Car接口的类实例
*/
Car getCar();
}
- 具体产品
BMWCar
,QQCar
/**
* BMW 汽车实现类
*/
public class BMWCar implements Car {
public void run() {
System.out.println("BMW run...");
}
}
/**
* QQ 汽车实现类
*/
public class QQCar implements Car {
public void run() {
System.out.println("QQ run...");
}
}
- 具体工厂
BMWFactory
,QQFactory
/**
* BMW 汽车工厂实现
*/
public class BMWFactory implements CarFactory {
public Car getCar() {
return new BMWCar();
}
}
/**
* QQ 汽车工厂实现
*/
public class QQFactory implements CarFactory {
public Car getCar() {
return new QQCar();
}
}
- 调用类
Client
/**
* 调用方角色
*/
public class Client {
/**
* 调用演示
*/
public void drive(){
CarFactory bmwFactory = new BMWFactory();
Car bmwCar = bmwFactory.getCar();
bmwCar.run();
CarFactory qqFactory = new QQFactory();
Car qqCar = qqFactory.getCar();
qqCar.run();
Car car = getCarByType(1);
if (car!=null){
car.run();
}
car = getCarByType(2);
if (car!=null){
car.run();
}
}
/**
* 简单工厂实现, 通过传入的参数返回具体的汽车
* @param carType
* @return
*/
public Car getCarByType(int carType){
Car car = null;
switch (carType){
case 1:
CarFactory bmwFactory = new BMWFactory();
Car bmwCar = bmwFactory.getCar();
car = bmwCar;
break;
case 2:
CarFactory qqFactory = new QQFactory();
Car qqCar = qqFactory.getCar();
car = qqCar;
break;
}
return car;
}
}
总结
优点: 1. 隐藏产品创建细节,我们只需要关系具体产品对应的具体工厂; 2. 完全符合设计模式"开闭"原则,当有新产品加入时只需要实现对应的工厂类;
缺点: 产品种类太多时维护难度增加.
设计模式二: 工厂方法(Factory Method)的更多相关文章
- 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)
在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...
- Spring 通过工厂方法(Factory Method)来配置bean
Spring 通过工厂方法(Factory Method)来配置bean 在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. ...
- [设计模式-创建型]工厂方法(Factory Method)
概括 名称 Factory Method 结构 动机 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method 使一个类的实例化延迟到其子类. 适用性 当一个类不知道它所必 ...
- 设计模式——工厂方法(Factory Method)
定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. ——DP UML类图 模式说明 抽象业务基类 实际业务类的公共基类,也是工厂要创建的所有对象的父类,这部分 ...
- Headfirst设计模式的C++实现——工厂方法(Factory Method)
引用原书的一句话:所有的工厂模式都用来封装对象的创建,工厂方法模式通过让子类决定该创建的对象是什么来达到封装的目的. Pizza类及其派生类与上一例相同 PizzaStore.h #ifndef _P ...
- 设计模式 笔记 工厂方法 Factory Methon
//---------------------------15/04/09---------------------------- //factory method 工厂方法-------对象创建型模 ...
- java设计模式(二)---工厂方法模式
2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...
- 工厂方法 Factory Method
背景:有一个应用框架,它可以向用户显示多个文档.在这个框架中,两个主要的抽象是类Application和Document.这两个类都是抽象的.客户必须通过它们的子类来做与举替应用相关的实现. 分析:因 ...
- 设计模式(二)—工厂方法模式
凡是出现了大量的实例需要创建,而且具有共同的接口时,可以通过工厂方法模式进行创建. 一个接口: Sender public interface Sender{ public void sen ...
随机推荐
- vmware centos7 minimal 配置共享文件夹
使用的是VMware安装CentOS7 minimal版,系统镜像是CentOS-7-x86_64-DVD-1708.iso. 宿主机系统为win10,CentOS7 minimal过程省略,可参考h ...
- Netstat 常用命令--备忘录
Netstat 用于显示与IP .TCP .UDP 和ICMP 协议相关的统计数据,一般用于检验本机各端口的网络连接情况. 常用参数 -a (all)显示所有选项,默认不显示LISTEN相关-t (t ...
- GRE与VXLAN
一 GRE 1.1 概念 GRE全称是Generic Routing Encapsulation,是一种协议封装的格式,具体格式内容见:https://tools.ietf.org/html/rfc2 ...
- 如何在Jupyter里以不同的运行模式使用Pyspark
假设你的环境已经安装好了以下东西,如何详细的安装它们不在本文的讨论范围之内 具体的可疑参考三分钟搞定jupyter和pyspark整合 anaconda2 findspark pyspark 这里多说 ...
- [properJavaRDP]在网页中实现远程连接
内容摘要: 利用开源软件properJavaRDP实现远程桌面连接 如何让Applet嵌入到网页中正常运行 如何处理连接win7时的异常:Wrong modulus size! Expected 64 ...
- JDBC数据库连接池之dbcp
一.连接池的作用 数据库的连接是一种很重要的资源,如果一个项目比较小,连接数据库的次数比较少,我们可以采取直连的方式:“获取连接----使用----关闭连接”.但是如果一个网站访问量很大,假如同时有几 ...
- js实现在光标的位置 添加内容
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- deepin配置Oracle JDK
这里记录一下入手deepin后,安装JDK的过程,和之前的CentOS有些不同 本篇参考了两篇博客 1 2 第一篇有些问题,在第二篇中找到了解决方案 接下来是操作过程: 检查本机自带的OpenJDK, ...
- LODOP整页缩放,宽度、高度溢出缩放
LODOP中,超文本超过打印项高度会自动分页,可以用语句进行缩放,让打印内容都在一页中.例如,整页缩放和高度溢出缩放.如下是三个语句及其效果,注意对内容缩放可能会导致变形哦,毕竟是不等比例缩放:LOD ...
- 微言netty:不在浮沙筑高台
1. 写作缘起 几年前,我在一家农业物联网公司,负责解决其物联网产品线.我们当时基于.net平台打造了一套实时数据采集系统,可以把数以百万级的传感器传送回来的数据采集入库并根据这些数据进行建模.在搭建 ...