设计模式(四)Factory Method模式
简单来说,用Template Method模式来构建生成实例的工厂,就是Factory Method模式。在这个模式中,父类决定实例的生成方式,但不决定所要生成的具体的类,具体的处理全部交给子类负责。这样就可以将生成实例的框架和实际负责生成实例的类解耦。
下面的示例中,framework包是生成实例的框架。而idcard包是负责加工处理的。
首先根据下面的实例代码来解释一下这种常用的设计模式。
package BigJunOba.bjtu.framework; public abstract class Product {
public abstract void use();
}
Product抽象类属于framework包。这个类用来表示“产品”,定义了use方法,定义了“产品”是“任意的可以use的”东西。
package BigJunOba.bjtu.framework; public abstract class Factory { public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
} protected abstract Product createProduct(String string);
protected abstract void registerProduct(Product product);
}
Factory抽象类也属于framework包。在这里使用了Template Method模式,protected关键字说明只能被子类继承。最主要的create方法的意思是,通过create方法来生成Product实例。而create方法的实现是先调用createProduct生成产品,然后调用registerProduct方法注册产品。
package BigJunOba.bjtu.idcard; import BigJunOba.bjtu.framework.Product; public class IDCard extends Product { private String owner; IDCard(String owner) {
System.out.println("制作" + owner + "的ID卡");
this.owner = owner;
} @Override
public void use() {
System.out.println("使用" + owner + "的ID卡");
} public String getOwner() {
return owner;
}
}
IDCard类属于idcard包。作为Product的子类,用来表示ID卡。
package BigJunOba.bjtu.idcard; import java.util.ArrayList;
import java.util.List; import BigJunOba.bjtu.framework.Factory;
import BigJunOba.bjtu.framework.Product; public class IDCardFactoty extends Factory{ private List<String> owners = new ArrayList<String>(); @Override
protected Product createProduct(String owner) {
return new IDCard(owner);
} @Override
protected void registerProduct(Product product) {
owners.add(((IDCard)product).getOwner());
} public List<String> getOwners() {
return owners;
}
}
IDCardFactoty类也属于 idcard包。用来实现createProduct和registerProduct两种方法。
package BigJunOba.bjtu.test; import BigJunOba.bjtu.framework.Factory;
import BigJunOba.bjtu.framework.Product;
import BigJunOba.bjtu.idcard.IDCardFactoty; public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactoty();
Product card1 = factory.create("廉酱");
Product card2 = factory.create("桥爷");
card1.use();
card2.use();
}
}
测试类属于test包。这里是用工厂来创建ID卡的示例,然后再调用相关的方法。
制作廉酱的ID卡
制作桥爷的ID卡
使用廉酱的ID卡
使用桥爷的ID卡
测试结果如上图所示。
Factory Method模式的类图如上图所示。使用工厂方法设计模式的好处是,本实例中,framework包中没有引入idcard包,在Product类和Factory类中,也没有出现IDCard和IDCardFactory等具体类的名字。因此,即使用也有的框架生成全新的类时,也完全不需要对framework包进行修改。通俗来说,就是“framework包不依赖于idcard包”。
设计模式(四)Factory Method模式的更多相关文章
- 设计模式之Factory Method模式
作用:将实例的生成交给子类 用Template Method模式来构建生成实例的工厂,这就是Factory Method模式. 在Factory Method中,父类决定实例的生成方式,但并不决定所要 ...
- 设计模式:factory method模式
核心:将实例的生成交给子类,父类中只定义生成实例的接口 理解:对比模板方法模式的思维非常类似,模板方法模式中的模板方法理解成创造对象的抽象方法,不再是流程框架,就变成工厂方法模式,只是具体的方法是创建 ...
- 设计模式初学者笔记:Factory Method模式
如果要选择一种最多人熟悉的Factory Method模式的具体应用,那么就应该是MFC的App/Doc架构了.Factory Method主要在类框架中使用,以解决以下问题:框架必须实例化类,但框架 ...
- Java设计模式:Factory Method(工厂方法)模式
概念定义 工厂方法(Factory Method)模式,又称多态工厂(Polymorphic Factory)模式或虚拟构造器(Virtual Constructor)模式.工厂方法模式通过定义工厂抽 ...
- Factory Method模式
Factory Method(工厂方法)模式属于GoF设计模式中的创建型分组,它用于在不之制定待创建对象的具体类的情况下创建对象.--<asp.net设计模式> 说白了就是一个人想要出国旅 ...
- 设计模式学习--Factory Method
What Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Why Factory Method是一个比較基 ...
- java23种设计模式——四、原型模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
- [学习笔记]设计模式之Factory Method
写在前面 为方便读者,本文已添加至索引: 设计模式 魔法手札索引 在上篇笔记Abstract Factory设计模式中,时の魔导士创建了一系列的FoodFactory,并教会了其中一名霍比特人theC ...
- 一天一个设计模式——模板方法(Template Method)模式
一.模式说明 现实世界中的模板是用于将事物的结构规律予以固定化.标准化的成果,它体现了结构形式的标准化.例如镂空文字印刷的模板,通过某个模板印刷出来的文字字体大小都是一模一样,但是具体使用什么材质的颜 ...
随机推荐
- 【已解决】关于IDEA中 Tomcat 控制台打印日志中文乱码的解决
在 Idea 上面使用 Tomcat 时,发现控制台打印信息的时候,出行中文乱码问题; 可以通过以下几种解决办法 1:在-Dfile.encoding=UTF-8 在vm中设置编码方式 2.然后从Fi ...
- 认识Airflow的DAG
前文Airflow的第一个DAG已经跑起来了我们的第一个任务. 本文就来丰富这个任务. 回顾我们的任务内容 我们定义了DAG的名称为Hello-World, 这个叫dag_id, 补充说明descri ...
- 面试并发volatile关键字时,我们应该具备哪些谈资?
提前发现更多精彩内容,请访问 个人博客 提前发现更多精彩内容,请访问 个人博客 提前发现更多精彩内容,请访问 个人博客 写在前面 在 可见性有序性,Happens-before来搞定 文章中,happ ...
- 【SQL server基础】SQL视图加密,永久隐藏视图定义的文本
SQL可以对视图进行加密.也就是,可永久隐藏视图定义的文本. 注意 此操作不可逆.加密视图后,无法再修改它,因为无法再看到视图定义.如果需要修改加密视图,则必须删除它并重新创建另一个视图. 示例代 ...
- bootstrap具体知识点(2)
3.以移动设备为优先 <meta name=”viewport” content=”width=device-width,initial-scale=1,user-scalable=no”> ...
- Linux简单检查服务运行脚本
脚本内容如下: 此脚本含义:检查服务是否运行,在运行则记录日志,不在运行则记录日志并将服务启动 #!/bin/bash svrnm="tomcat" //设置服务名称time=`d ...
- TCP三次握手和四次握手全过程 为什么要三次握手而不是二次握手?
三次握手 第一次握手: 客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手: 服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送 ...
- docker服务在Mac上的启动与使用
在mac上打开安装的docker软件就可以启动docker服务了 点击顶部状态栏中鲸鱼图标会弹出操作菜单,显示着服务的状态,如下图所示: 只有在docker服务启动了之后,才可以在终端使用docker ...
- mysql互为主从(双主)配置
环境: ubuntu18.04.2 mysql5.7.21 #创建mysql属组 groupadd mysql useradd -g mysql mysql #查看属组 tail /etc/passw ...
- 04-12 scikit-learn库之随机森林
目录 scikit-learn库之随机森林 一.RandomForestClassifier 1.1 使用场景 1.2 代码 1.3 参数 1.4 属性 1.5 方法 二.RandomForestRe ...