设计模式~工厂方法模式
时间:2022-07-22
本文章向大家介绍设计模式~工厂方法模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
工厂方法模式是类的创建模式,又叫虚拟构造函数模式或多态性工厂模式。
工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
之前,我们说到简单工厂模式的优点是允许客户端相对独立于产品创建的过程,并在系统引入新产品的时候无需修改客户端,也就是说,它在某种程度上支持开闭原则。
但,简单工厂模式的缺点是对开闭原则的支持不够,因为如果有新的产品加入到系统中,就需要修改工厂类,将必要的逻辑加入到工厂中。
工厂方法模式的结构
从上图可以看出,这个使用了工厂方法模式的 系统涉及到以下角色:
- 抽象工厂角色(Creator):担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。在实际系统中,这个角色常常使用抽象java类实现。
- 具体工厂角色(Concrete Creator): 担任这个角色的是实现了抽象工厂接口的具体java类。
- 抽象产品角色(Product): 工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
- 具体产品角色(Concrete Product): 这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
抽象工厂角色和抽象产品角色都可以选择由java接口或者java抽象类来实现。
示意性源码如下:
抽象工厂角色Creator类源码
public interface Creator {
public Product factory();
}
抽象产品角色Product类源码
public interface Product {
}
具体工厂角色ConcreteCreator1类源码
public class ConcreteProduct1 implements Product {
public ConcreteProduct1(){
//do something
}
}
具体工厂角色ConcreteCreator2类源码
public class ConcreteCreator2 implements Creator {
public Product factory() {
// TODO Auto-generated method stub
return new ConcreteProduct2();
}
}
具体产品角色ConcreteProduct1类的源码
public class ConcreteProduct1 implements Product {
public ConcreteProduct1(){
//do something
}
}
具体产品角色ConcreteProduct2类的源码
public class ConcreteProduct2 implements Product {
public ConcreteProduct2(){
//do something
}
}
客户端角色Client类的源码
public class Client {
private static Creator creator1,creator2;
private static Product prod1,prod2;
public static void main(String[] args) {
// TODO Auto-generated method stub
creator1 = new ConcreteCreator1();
prod1 = creator1.factory();
creator2 = new ConcreteCreator2();
prod2 = creator2.factory();
}
}
示例
工厂方法模式在农场系统中的实现
设计图如下:
代码如下:
然后是产品相关
java语言中工厂方法模式的例子
在java聚集中的应用
一个具体的java聚集对象会通过这个iterator方法接口返还一个具体的Iterator类。
可以看出,这个iterator()方法就是一个工厂方法。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php DES加密算法实例分析
- php提供实现反射的方法和实例代码
- PHP实现批量修改文件名的方法示例
- Linux VPS快速下载Bilibili视频脚本 ,支持1080P/720P/360P等格式
- PHP递归统计系统中代码行数
- PHP切割整数工具类似微信红包金额分配的思路详解
- php写入文件不覆盖的实例讲解
- php解决crontab定时任务不能写入文件问题的方法分析
- Laravel项目中timeAgo字段语言转换的改善方法示例
- php生成微信红包数组的方法
- 解决php写入数据库乱码的问题
- php写入txt乱码的解决方法
- PHP实现的AES 128位加密算法示例
- php写入mysql中文乱码的实例解决方法
- php实现的支付宝网页支付功能示例【基于TP5框架】