设计模式二: 工厂方法(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 ...
随机推荐
- 好程序员分享DIV+CSS3和html5+CSS3有什么区别
DIV+CSS3和html5+CSS3有什么区别,不管是DIV+CSS3还是html5+CSS3,他们都是我们对网页开发布局方式的统称,但是DIV+CSS3作为网页的基础开发这句话其实并不严谨,因为而 ...
- EF Core 多对多配置
1.配置2个数据表 T_Authors ,T_Books 2.新建控制台项目,安装EF驱动 PM> Install-Package Pomelo.EntityFrameworkCore.Mysq ...
- SQL Server中NULL的一个测试
我们都知道SQL Server中NULL是一个很特殊的存在,因为NULL不会等于任何值,且NULL也不会不等于任何值.对于NULL我们只能使用IS或IS NOT关键字来进行比较. 我们先来看看下面一个 ...
- 二十九、layui分页插件的使用
<div id="page1"></div> <script> //开启分页 var page = 1; function findstoreL ...
- pyspider常见错误
安装完爬虫框架pyspider之后,使用pyspider all 命令,可能会出现以下错误: - Deprecated option 'domaincontroller': use 'http_aut ...
- jquery动态设置图片路径和超链接href属性
js document.getElementById("myImage").src="hackanm.gif"; jquery $("#img&quo ...
- 通过FactoryBean配置Bean
这是配置Bean的第三种方式,FactoryBean是Spring为我们提供的,我们先来看看源码: 第一个方法:public abstract T getObject() throws Excepti ...
- 7.docker日志收集
默认情况下,docker logs或者docker service logs显示命令的输出,就像在终端中以交互方式运行命令时一样.UNIX和Linux命令通常开在运行时间上三个I / O流,所谓的 S ...
- IO多路复用和local概念
一.local 在多个线程之间使用threading.local对象,可以实现多个线程之间的数据隔离 import time import random from threading import T ...
- python常用的基本操作
打开cmd,pip list 可以查看python安装的所以第三方包