工厂方法模式-Factory Method

工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法让实例化的具体内容交给子类工厂来进行.

本文中的例子是这样的. 生产一个身份证, 需要由工厂来创建. 但是这个创建的过程是一个固定的流程: 1. 获取身份 2. 根据身份创建身份证 3. 注册身份证

类关系图如下:

Product是所有产品的抽象类.

IDCard是其中一种产品, 身份证.

Factory是工厂接口.其中的create方法就是用来生成某个具体产品的. create方法是一个模板方法. 里面调用了createProduct方法和registerProduct方法, 而这两个方法是抽象方法, 交给了子类去实现细节. 自己只是提供了一个模板方法.

IDCardFactory是生成身份证的工厂. 只需实现父类遗留下来的两个方法(createProduct方法和registerProduct方法), 即可通过调用create()方法来创建IDCard.

依赖关系如下:

Product抽象类

工厂是用于生成实例的, 咱们先把这些实例抽象出来, 定义为Product. Product有一个特性就是能被使用, 即 有一个use()方法

public abstract class Product {
public abstract void use();
}

Factory抽象类

Factory是一个抽象类, 也是生成具体实例的工厂的抽象模板.

public abstract class Factory {
/**
* 这里定义执行模板
*/
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
} /**
* 留给子类来实现
*/
protected abstract Product createProduct(String owner); /**
* 留给子类来实现
*/
protected abstract void registerProduct(Product p); }

IDCard类

ID卡,也就是身份证, 被定义为是一种产品, 继承自Product类.

public class IDCard extends Product {
private String owner; public IDCard(String owner) {
this.owner = owner;
} @Override
public void use() {
System.out.println(owner + "的ID卡");
} public String getOwner() {
return owner;
}
}

IDCardFactory类

这个工厂类是用于生成IDCard实例的工厂.实现了模板工厂Factory抽象类中未实现的方法, 也就是细节是自己控制, 而通用的执行模板是有Factory类统一定义的.

public class IDCardFactory extends Factory {
private ArrayList<String> owners = new ArrayList<>(); @Override
protected Product createProduct(String owner) {
return new IDCard(owner);
} @Override
protected void registerProduct(Product p) {
owners.add(((IDCard) p).getOwner());
}
}

Main

本类用于运行测试

public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactory(); Product card1 = factory.create("张三");
Product card2 = factory.create("李四");
Product card3 = factory.create("王五"); card1.use();
card2.use();
card3.use();
}
}  

本例子的代码github地址: https://github.com/GoldArowana/design-patterns/tree/master/src/main/java/com/king/patterns/factory_method

工厂方法模式-Factory Method(Java实现)的更多相关文章

  1. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  2. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  3. 二十四种设计模式:工厂方法模式(Factory Method Pattern)

    工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...

  4. 设计模式-03工厂方法模式(Factory Method Pattern)

    插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...

  5. IOS设计模式浅析之工厂方法模式(Factory Method)

    概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...

  6. 六个创建模式之工厂方法模式(Factory Method Pattern)

    问题: 在使用简单工厂模式的时候,如果添加新的产品类,则必需修改工厂类,违反了开闭原则. 定义: 定义一个用于创建对象的接口,让子类决定具体实例化哪个产品类.此时工厂和产品都具有相同的继承结构,抽象产 ...

  7. 大话设计模式--工厂方法模式 Factory Method -- C++实现

    1. 工厂方法模式 定义一个用于创建对象的接口, 让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 和简单工厂模式相比: A: 简单工厂模式最大的优点在于工厂类中包含有必要的逻辑判断, ...

  8. 工厂方法模式(Factory Method Pattern)

    工厂方法模式概述 工厂方法模式是为了弥补简单工厂模式的不足并且继承它的优点而延生出的一种设计模式,属于GoF中的一种.它能更好的符合开闭原则的要求. 定义:定义了一个用于创建对象的接口,但是让子类决定 ...

  9. [设计模式]工厂方法模式(Factory Method)

    模式目的 定义一个用于创建对象的接口,让其子类来决定实例化哪个类. 工厂方法模式将类的实例化延迟到了子类中进行. 模式结构 组成部分 产品(Product) - 定义了产品功能的接口 具体产品(Con ...

随机推荐

  1. 我的第一个python web开发框架(26)——定制ORM(二)

    弄完底层数据库操作模块后,接下来要做的是ORM的正式设计.在开始之前,我们需要思考一下怎么来设计一个ORM呢?这个类它能帮助我们处理什么样的问题?需要有哪些功能模块?怎么做到针对不同的数据库与表单进行 ...

  2. 文本分类实战(六)—— RCNN模型

    1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...

  3. xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH ​

    xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH ...

  4. VMware安装CentOS 6.9教程

    CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linu ...

  5. Mybatis实现高级映射一对一、一对多查询

    终于把论文写得差不多了,系统也不急着完成,可以抽出点时间来完成这个系列的博客了.在写本博客之前我是惶恐不安的,高级映射一贯是持久层框架里的重中之重,小到自己开发小系统,大到企业级开发,表的存在从来就不 ...

  6. VS2010创建MVC4项目提示错误: 此模板尝试加载组件程序集 “NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral,

    在安装VS2010时没有安装MVC4,于是后面自己下载安装了(居然还要安装VS2010 SP1补丁包).装完后新建MVC项目时却提示: 错误: 此模板尝试加载组件程序集 “NuGet.VisualSt ...

  7. 其它综合-运维老鸟分享linux运维发展路线规划

    运维老鸟分享linux运维发展路线规划 linux 运维发展路线常见的就是下面两条路线: 第一条:运维应用-->系统架构-->运维开发-->系统开发 第二条:运维应用-->应用 ...

  8. Python 使用 matplotlib绘制3D图形

    3D图形在数据分析.数据建模.图形和图像处理等领域中都有着广泛的应用,下面将给大家介绍一下如何在Python中使用 matplotlib进行3D图形的绘制,包括3D散点.3D表面.3D轮廓.3D直线( ...

  9. RPM Database 实战详解

    RPM 是 RPM Package Manager 的简写,是发源于 Red-hat 系统的软件管理工具,所以最初的名字叫做 Red-hat Packager Manager.目前,RPM 已发展成为 ...

  10. Microsoft Visual Studio Tools for AI

    https://www.visualstudio.com/zh-hans/downloads/ai-tools-vs/ 开发.调试和部署深度学习和 AI 解决方案 Visual Studio Tool ...