工厂方法模式-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. the security settings could not be applied to the database(mysql安装error)【简记】

    在安装mysql时,出现“The security settings could not be applied to the database because the connection has f ...

  2. windows下安装mysql数据库修改端口号

    Window版本 卸载原本的mysql sc delete MySQL //删除mysql 1.下载 1 2 3 MySQL   https://dev.mysql.com/downloads/ins ...

  3. jenkins使用开始踩坑(1)

    上篇文章 安装教程 :https://www.cnblogs.com/linuxchao/p/linuxchao-jenkins-setup.html 一.前戏 话说上一篇文章安装完 JDK 和 je ...

  4. 超哥笔记--shell 基本命令(4)

    一 linux 命令行的组成结构 自定义命令行结构 PS1变量来控制 \u \W 最后一位工作目录 \w 绝对路径工作目录 \t 显示24h制的时间 \h PS1="[\u@\h \w \t ...

  5. IDEA+快捷键

    格式化代码:ctrl+alt+L IDEA快捷键管理:https://blog.csdn.net/h8178/article/details/78328097  (duplicate:为复制上一行)

  6. Python排序算法——冒泡排序

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10786904.html 一.冒泡排序(Bubb ...

  7. P5239 回忆京都(洛谷3月月赛T2)

    题目描述 射命丸文在取材中发现了一个好玩的东西,叫做组合数. 组合数的定义如下:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合.所有组合的数量,就是组合数 ...

  8. 从 0 到 1 实现 React 系列 —— 1.JSX 和 Virtual DOM

    看源码一个痛处是会陷进理不顺主干的困局中,本系列文章在实现一个 (x)react 的同时理顺 React 框架的主干内容(JSX/虚拟DOM/组件/生命周期/diff算法/setState/ref/. ...

  9. (hdu 6024) Building Shops

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6024 Problem Description HDU’s n classrooms are on a ...

  10. 乐观锁vs悲观锁

    引言 为什么需要锁(并发控制) 在并发的环境中,会存在多个用户同时更新同一条数据,这时就会产生冲突. 冲突结果: 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失. 脏读:当一个事 ...