一、简单工厂模式

  【之所以叫简单,说明没有完全做到 设计模式的要求】

  前言:活字印刷术,面向对象思想 复用 维护 扩展 灵活 高内聚低耦合
  以 实现 一个计算器 为例:

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---工厂方法模式的更多相关文章

  1. 工厂方法模式——创建型模式02

    1. 简单工厂模式     在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...

  2. 设计模式C#合集--工厂方法模式

    简单工厂,代码: public interface ISpeak { public void Say(); } public class Hello : ISpeak { public void Sa ...

  3. PHP设计模式(二)工厂方法模式(Factory Method For PHP)

    简单工厂简述: 简单工厂模式实现了生产产品类的代码跟客户端代码分离,在工厂类中你可以添加需要生成长跑的逻辑代码(new 产品类),但是问题来了,优秀的代码是符合"开闭原则"如果你要 ...

  4. javascript设计模式-工厂方法模式

    工厂方法模式笔记  通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例  对于创建多类对象,简单工厂不太实用,这是简单工厂模式的应用局限,当然这正是工厂方法模式的价值之所在  通过工厂方法模 ...

  5. C#设计模式(3)——工厂方法模式

    一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...

  6. C#设计模式系列:工厂方法模式(Factory Method)

    1. 工厂方法模式简介 1.1 定义 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法模式是以一个类的实例化延迟到其子类. Factory Method模式用于在不指定待创建 ...

  7. 设计模式(三)工厂方法模式(Factory Pattern)

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  8. php实现设计模式之 工厂方法模式

    <?php /* * *工厂方法模式,创建型模式 定义一个用于创建对象的工厂接口,让子类决定实例化哪一个类.Factory Method使用一个类的实例化延迟到其子类 * * 四个角色: * 工 ...

  9. 【2016-10-17】【坚持学习】【Day8】【工厂方法模式】

    工厂方法模式又叫工厂模式,虚拟构造器模式 定义: 工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该 ...

  10. 工厂方法模式与IoC/DI

    IoC——Inversion of Control  控制反转 DI——Dependency Injection   依赖注入 1:如何理解IoC/DI        要想理解上面两个概念,就必须搞清 ...

随机推荐

  1. Vi的三种模式及其指令

    第一部分:一般指令模式可用按键说明,光标移动,复制粘贴.搜索替代 移动光标的方法: 移动光标的方法 h或(左箭头) 光标向左移动一个字符 j或(下箭头) 光标向下移动一个字符 k或(上箭头) 光标向上 ...

  2. 【转】推荐给初级Java程序员的3本进阶书

    ImportNew 注: 原作者在这篇文章中介绍3本不错的技术书籍.作者认为这些书籍对新手或者学生而言尤其有帮助.通过一些基础性的教程入门后,我们可以使用Java做基础性的编程.然而,当我们需要从初级 ...

  3. Objectarx 相交矩形求并集 面域转多段线

    测试结果: 主要思路:拾取一个点作为矩形的插入点,分别以该点进行两次jig操作,就能得到白色的两个相交的polyline,之后需要变成红色的封闭多段线.做法就是:求出两个白色矩形的面域,然后通过boo ...

  4. 小程序的<label>标签

    用来改进表单组件的可用性. 使用for属性找到对应的id,或者将控件放在该标签下,当点击时,就会触发对应的控件. for优先级高于内部控件,内部有多个控件的时候默认触发第一个控件. 目前可以绑定的控件 ...

  5. ReactNative: 自定义ReactNative API组件

    一.简介 在前面介绍了很多ReactNative中UI组件和API组件,这些都是Facebook团队封装好的基础组件,开发者可以直接使用.然而,在实际的开发过程中,面对复杂的需求,此时原生的Nativ ...

  6. cogs 2. 旅行计划 dijkstra+打印路径小技巧

    2. 旅行计划 ★★   输入文件:djs.in   输出文件:djs.out   简单对比时间限制:3 s   内存限制:128 MB [题目描述] 过暑假了,阿杜准备出行旅游,他已经查到了某些城市 ...

  7. 快速幂模板Super

    //求x^nint ans=1;while(n){ if(n&1) ans=ans*x; x*=x; n>>=1;} 快速幂就是快速算底数的n次幂.其时间复杂度为 O(logN), ...

  8. java 大数的学习

    import java.math.*; import java.util.*; public class study { public static void main(String[] args) ...

  9. Window下安装并使用InfluxDB可视化工具 —— InfluxDBStudio

    下载 直接访问: https://github.com/CymaticLabs/InfluxDBStudio/releases/tag/v0.2.0-beta.1 创建or编辑InfluxDB 这个软 ...

  10. Miller-Rabin​素数测试算法

    \(Miller-Rabin\)​素数测试 用途 判断整数\(n\)是否是质数,在\(n\)较小的情况下,可以使用试除法,时间复杂度为\(O(\sqrt n)\).但当\(n\)的值较大的时候,朴素的 ...