工厂方法模式-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爬虫【实战篇】bilibili视频弹幕提取

    两个重要点 1.获取弹幕的url是以 .xml 结尾 2.弹幕url的所需参数在视频url响应的 javascript 中 先看代码 import requests from lxml import ...

  2. Storm入门(三)HelloWorld示例

    一.配置开发环境 storm有两种操作模式: 本地模式和远程模式.使用本地模式的时候,你可以在你的本地机器上开发测试你的topology, 一切都在你的本地机器上模拟出来; 用远程模式的时候你提交的t ...

  3. 第十届蓝桥杯省赛JavaB组个人题解

    前言 以下的第十届蓝桥杯Java B组省赛的题目题解只是我个人的题解,提供一些解题思路,仅作参考,如有错误,望大家指出,不甚感激,我会及时更改. 试题 A: 组队 ----- 答案:490 [问题描述 ...

  4. 2.[Andriod]Andriod Studio结合Visual Studio Emulator for Android调试Android App

    0. 工欲善其事必先利其器 上一篇博客对比了一下Android和WinPhnoe的布局容器,后续篇章重点放在Android的开发上了. 说到开发就绕不开调试程序,调试Android App我们有2种选 ...

  5. VUE中 style scoped 修改原有样式

    作用域CSS 当<style>标记具有该scoped属性时,其CSS将仅应用于当前组件的元素.这类似于Shadow DOM中的样式封装.它有一些警告,但不需要任何polyfill.通过使用 ...

  6. Mysql_安装

    安装环境:win7 1.下载zip安装包: MySQL8.0 For Windows zip包下载地址:https://dev.mysql.com/downloads/file/?id=476233, ...

  7. mongoDB操作详细

    简介 它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等 关系型数据库中有一个 "表" 的概念,有 ...

  8. xshell连接虚拟机ubuntu

    在ubuntu界面,打开终端terminal,输入: ifconfig 出现如下界面: fb993608316@ubuntu:/$ ifconfig eth0 Link encap:Ethernet ...

  9. Shell命令-文件及内容处理之cut、rev

    文件及内容处理 - cut.rev 1. cut:切割文件内容 cut命令的功能说明 cut 命令用于显示每行从开头算起num1 到 num2 的文字. cut命令的语法格式 cut [OPTION] ...

  10. JAVA多线程-内存模型、三大特性、线程池

    一.线程的三大特性 原子性.可见性.有序性 1)原子性,即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.原子性其实就是保证数据一致.线程安全一部分. 2)可见性,即 ...