工厂方法模式-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. A Deep Learning-Based System for Vulnerability Detection(一)

    接着上一篇,讨论讨论具体步骤实现方法.步骤1-3分别在下面进行阐述,步骤4,6都是标准的,步骤5类似于步骤1-3. 结合这个图进行讨论详细步骤: 步骤1:提取库/API函数调用和程序片段 1.1将库/ ...

  2. Docker: 企业级镜像仓库Harbor部署(http)

    Harbor离线安装包下载地址:https://github.com/goharbor/harbor Docker compose(安装harbor需要用到docker compose)下载地址:ht ...

  3. 4.机器学习——统计学习三要素与最大似然估计、最大后验概率估计及L1、L2正则化

    1.前言 之前我一直对于“最大似然估计”犯迷糊,今天在看了陶轻松.忆臻.nebulaf91等人的博客以及李航老师的<统计学习方法>后,豁然开朗,于是在此记下一些心得体会. “最大似然估计” ...

  4. nginx报错:failed (13: Permission denied)

    vim nginx.conf 修改user nginx为当前系统用户,如:user root

  5. OpenResty:通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台

    关于 http://openresty.org/cn/about.html 这个开源 Web 平台主要由章亦春(agentzh)维护.在 2011 年之前曾由淘宝网赞助,在后来的 2012 ~ 201 ...

  6. 2019年桌面Linux需要做好的7件事

    2019年桌面Linux需要做好的7件事 新的一年已经到来,这意味着又一年过去了,Linux还是没有发现自己主宰了桌面.Linux在许多方面做得非常好,在接下来的几周,我们将研究一些最适合您各种需求的 ...

  7. Openwrt无线中继设置并访问外网

    Openwrt无线中继设置并访问外网 本篇博文参考来自:http://blog.csdn.net/pifangsione/article/details/13162023 配置目标 主路由器使用AP模 ...

  8. WiFi广告强推的基本技术原理和一些相关问题

    WiFi推原理(转) 本文地址:http://jb.tongxinmao.com/Article/Detail/id/412 WiFi广告强推的基本技术原理和一些相关问题 WiFi广告推送原理就是利用 ...

  9. 秒杀系统HTML倒计时设置

    倒计时就是在秒杀表中设定好要秒杀的时间 再减去现在的时间 把时间差显示在页面上 由于第一次搞秒杀倒计时  辛苦搞了半天  留此微博  以留备用 <!DOCTYPE html PUBLIC &qu ...

  10. 三、调试IIS启动域名配置

    一.IIS配置启动VS以及域名 1.hosts配置 2.配置 注意: 1.Web和Api 端口在IIS都设置80即可,都可以同时运行不冲突,与vs的IIS express启动方式不同vs会指定不同的两 ...