工厂方法模式-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. Lua中string.format占位符的使用

    虽然lua中字符串拼接"string.format"相对于".."消耗较大,但有时为了代码的可读性,项目中还是经常用到"string.format&q ...

  2. 【学习】Linux Shell脚本编程

    1.脚本的组成和执行 Linux shell脚本的结构并不复杂,其主要由变量.内部命令以及shell的语法结构和一些函数.其他命令行的程序等组成,以下是一个简单的shell脚本. #!/bin/bas ...

  3. Linux、CentOS7下JDK环境配置

    Linux版本 1.上传JDK包至指定目录,并解压 tar -xzvf jdk-7u80-linux-x64.tar.gz 2.配置JDK环境变量 打开/etc/profile配置文件 vim /et ...

  4. Django学习开发--笔记一(从零开始)

    创建django项目注: 首先需在python中下载django 命令:pip install django1.任意文件中创建django项目 diango-admin startproject my ...

  5. 码农人生——从未学过Android如何开发Android App 案例讲解-第002期案例

    标题有点晃眼,本次分享是002期博文的实践故事,不会有任何代码.也不会教别人android 如何开发,类似博文已经有大批大批,而且还会有陆陆续续的人写,我写的文章,主要是经验之谈,希望总结出的一些方法 ...

  6. javascript基础之函数

    javascript的函数定义与python有很大的区别,的记住格式就好,下面请看代码 // 函数 // 简单定义 function func() { console.log('hello word' ...

  7. SystemTap Beginners Guide

    SystemTap 3.0 SystemTap Beginners Guide Introduction to SystemTap Edition 3.0   Red Hat, Inc. Don Do ...

  8. 好程序员web前端分享css常用属性缩写

    好程序员web前端分享css常用属性缩写,使用缩写可以帮助减少你CSS文件的大小,更加容易阅读.css缩写的主要规则如下: 颜色 16进制的色彩值,如果每两位的值相同,可以缩写一半,例如: #0000 ...

  9. (四)Exploring Your Cluster

    The REST API Now that we have our node (and cluster) up and running, the next step is to understand ...

  10. 保护 .NET Core 项目的敏感信息

    我们的项目中几乎都会有配置文件,里面可能会存储一些敏感信息,比如数据库连接字符串.第三方 API 的 AppKey 和 SecretKey 等. 对于开源项目,这些敏感信息肯定不能随着源代码一起提交到 ...