num07---工厂方法模式
一、简单工厂模式
【之所以叫简单,说明没有完全做到 设计模式的要求】
前言:活字印刷术,面向对象思想 复用 维护 扩展 灵活 高内聚低耦合
以 实现 一个计算器 为例:
1、创建 抽象类count, 这是一个计算类,有一个计算方法calculate
public abstract class Count {
public abstract double calculate(double num1, double num2) throws Exception;
}
2、创建具体的计算类【加减乘除等等】,分别继承抽象计算类count,重写各自独有的计算方法。
比如加法类:
public class Plus extends Count{
@Override
public double calculate(double num1, double num2) {
return num1 + num2;
}
}
3、创建工厂类,根据用户传来的不同运算符,生成不同的计算类对象。【计算类对象由工厂生成,而不是用户手动去new创建】
public class Factory {
public static Count createObj(String oper){
Count count = null;
switch(oper){
case "+":
count = new Plus();
break;
case "-":
count = new Subtract();
break;
case "*":
count = new Ride();
break;
case "/":
count = new Divide();
break;
case "%":
count = new Remainder();
break;
default:
System.out.println("����������");
break;
}
return count;
}
}
4、测试类中main()进行验证 。
Factory factory = new Factory(); //创建工厂
Count createObj = factory.createObj(oper); //oper 操作运算符 + - * .......
double calculate = createObj.calculate(d1, d2);

简单工厂模式,是在工厂类中进行逻辑判断,根据客户端的条件动态实例化相关的类,去除了客户端与具体产品的依赖,但是这样有一个问题,违反了开放封闭原则,如果新增一个逻辑,就必须修改工厂类中的逻辑判断的代码
====================================================================================================================================================
二、工厂方法模式
工厂模式解决了简单工厂的缺点。将工厂类接口抽象化,然后创建不同的子类工厂类,实现工厂类接口。每个子类工厂去实现具体的逻辑产品类。
本质上就是把原有工厂类实现的 实例化代码逻辑 延迟 到 其 子类中去实现。

样例代码:
创建一个模型工厂接口以及两个类型的模型工厂实现类,一个徐工类,一个利勃海尔类,不同工厂分别创建对应类型 的模型对象。
* @description :建立模型父类工厂接口
*/
public interface CreateModelParentFactory {
//创建模型方法
public Model createModel();
}
* @description :利勃海尔类模型创建工厂
*/
public class CreateLiebherrModelFactory implements CreateModelParentFactory {
@Override
public Liebherr createModel() {
return new Liebherr();
}
}
* @description :徐工类模型创建工厂
*/
public class CreateXuGongModelFactory implements CreateModelParentFactory {
@Override
public Xugong createModel() {
return new Xugong();
}
}
创建模型类以及不同品牌的模型类子类。
* @description :
*/
public class Model {
public void testFunction() {
System.out.println("我是模型父类");
}
}
public class Liebherr extends Model{
public void testFuction() {
System.out.println("我是利勃海尔类模型");
}
}
*/
public class Xugong extends Model {
public void testFunction() {
System.out.println("我是徐工类模型");
}
}
测试方法:
* @description :
*/
public class Main {
public static void main(String[] args) {
CreateLiebherrModelFactory liFactory = new CreateLiebherrModelFactory();
Liebherr libModel = liFactory.createModel();
libModel.testFuction();
}
}
结果:
我是利勃海尔类模型

现在如果想要生产新的 三一重工类的模型,就去新建三一模型类、三一类模型工厂。即可。
相比较简单工厂模式而言,工厂模式避免了违背开放封闭原则,又保持了封装对象的创建过程,缺点是每增加一个产品,需要增加类,增加开发量。
====================================================================================================================================================
三、抽象工厂模式

上述是一个pizza的例子,两个地点类型(北京、伦敦),两个口味(cheess、pepper),
对应到模型的例子中,两个品牌类型(徐工、利勃海尔),两个车辆用途(挖机、吊车),代码如下:
模型类以及子类:





模型抽象工厂以及其子工厂实现类



测试:
public static void main(String[] args) {
CreateXuGongModelFactory xgFac = new CreateXuGongModelFactory();
Model xgwjObj = xgFac.createModel("wj");
xgwjObj.testFunction();
}
======================
工厂模式JDK源码分析:


======================
小结

======================
关于三者工厂模式的联系区别:
【参考 ps: https://www.cnblogs.com/sanjun/p/9972386.html】
- 工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类
- 抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类
- 区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。
再来看看工厂方法模式与抽象工厂模式对比:

num07---工厂方法模式的更多相关文章
- 工厂方法模式——创建型模式02
1. 简单工厂模式 在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...
- 设计模式C#合集--工厂方法模式
简单工厂,代码: public interface ISpeak { public void Say(); } public class Hello : ISpeak { public void Sa ...
- PHP设计模式(二)工厂方法模式(Factory Method For PHP)
简单工厂简述: 简单工厂模式实现了生产产品类的代码跟客户端代码分离,在工厂类中你可以添加需要生成长跑的逻辑代码(new 产品类),但是问题来了,优秀的代码是符合"开闭原则"如果你要 ...
- javascript设计模式-工厂方法模式
工厂方法模式笔记 通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例 对于创建多类对象,简单工厂不太实用,这是简单工厂模式的应用局限,当然这正是工厂方法模式的价值之所在 通过工厂方法模 ...
- C#设计模式(3)——工厂方法模式
一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...
- C#设计模式系列:工厂方法模式(Factory Method)
1. 工厂方法模式简介 1.1 定义 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法模式是以一个类的实例化延迟到其子类. Factory Method模式用于在不指定待创建 ...
- 设计模式(三)工厂方法模式(Factory Pattern)
一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...
- php实现设计模式之 工厂方法模式
<?php /* * *工厂方法模式,创建型模式 定义一个用于创建对象的工厂接口,让子类决定实例化哪一个类.Factory Method使用一个类的实例化延迟到其子类 * * 四个角色: * 工 ...
- 【2016-10-17】【坚持学习】【Day8】【工厂方法模式】
工厂方法模式又叫工厂模式,虚拟构造器模式 定义: 工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该 ...
- 工厂方法模式与IoC/DI
IoC——Inversion of Control 控制反转 DI——Dependency Injection 依赖注入 1:如何理解IoC/DI 要想理解上面两个概念,就必须搞清 ...
随机推荐
- 关于i++的底层原理分析
首先看一道典型题 public class Test { static int x, y, z; static { int x = 5;//局部变量 x--; } static { x--; } pu ...
- vue传值(父子传值,非父子传值)
vue组件传值,分为父子传值和非父子传值,父子传值又分为父传子和子传父. 组件之间的传值,实现了数据的联动,是从操作Dom到操作数据一个跳转性的突破,在学习vue双向绑定原理之后, 这种观念就应该继续 ...
- Ubuntu16安装NVIDIA驱动后重复登录 简单粗暴
第一步 卸载所有NVIDIA的东西 第二步 开机,应该能进入默认驱动的桌面了,在设置里关闭开机密码,开机自动登录 第三步 安装英伟达驱动
- Nginx的一理解(1)
1.请解释一下什么是Nginx? 答:Nginx是一个web服务器和反向代理服务器,用于HTTP.HTTPS.SMTP.POP3和IMAP协议. 2.请列举Nginx的一些特性? 答:Nginx服务器 ...
- 用PHP写下HELLO WORLD!
一.选择PHP开发工具 1.phpstorm最新版本 2.打开phpstorm界面 按create键,选择new window ,出下如下页面: 鼠标放在文件夹上,右键单击,弹出以下对话框:做如下操作 ...
- python shutil 文件(夹)的复制、删除、移动、压缩和解压
高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中 import shutil shutil.copy ...
- 12.instanceof和类型转换
Instanceof: 判断一个对象是什么类型的~,可以判断两个类之间是否存在父子关系 package com.oop.demo07; public class Person { public voi ...
- Jenkins自动执行python脚本输出测试报告
前言 在用python做自动化测试时,我们写好代码,然后需要执行才能得到测试报告,这时我们可以通过 Jenkins 来进一步完成自动化工作. 借助Jenkins,我们可以结合 Git/SVN 自动拉取 ...
- 【模板】2-SAT问题
问题简述 有 \(n\) 个变量,每个变量可赋为 \(1\) 或 \(0\) 必须满足一些限制条件,如" \(a\) 为1 或 \(b\) 为0 " " \(a\) 为0 ...
- java效率工具 Lombok
Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toStringm异常处理,I/O流的关闭操作等等,这些样板代码既没有技术含量,又影响着代码的美观,Lombok应运而生. ...