美文网首页
2019-01-20_工厂方法模式

2019-01-20_工厂方法模式

作者: kikop | 来源:发表于2019-01-20 16:52 被阅读0次

1.2.工厂方法模式(Factory Method Pattern)

场景:工厂方法模式主要是客户知道要实例化哪个对象。在简单的工厂模式里,我们创建了一个类似工具的类来创建相应的具体类对象。正因为其太过简单,有一点不成规范。所以,这里要对其做一些适当地封装。

我们来看一下工厂方法模式的定义:

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

1.2.1.FactoryMethod应用实例

[图片上传失败...(image-4bff39-1547974200006)]


图片2.png

1.2.2.代码实现

1.2.2.1.定义文档接口

package com.tech.ability.mydesignpattern.mycreatepattern.FactoryMethod3;

/**

  • 定义文档接口

  • Created by kikop on 2018/12/10.

*/

public interface IDocument {

/**

 * 打开

 */

void open();

/**

 * 关闭

 */

void close();

/**

 * 保存

 */

void save();

/**

 * 撤销

 */

void revert();

}

1.2.2.2.定义Pdf文档实现接口

package com.tech.ability.mydesignpattern.mycreatepattern.FactoryMethod3;

/**

  • Created by kikop on 2018/12/10.

*/

public class PdfDocument implements IDocument {

@Override

public void open() {

    System.out.println(this.getClass().toString()+":open.");

}

@Override

public void close() {

    System.out.println(this.getClass().toString()+":close.");

}

@Override

public void save() {

    System.out.println(this.getClass().toString()+":save.");

}

@Override

public void revert() {

    System.out.println(this.getClass().toString()+":revert.");

}

}

1.2.2.3.定义Txt文档实现接口

package com.tech.ability.mydesignpattern.mycreatepattern.FactoryMethod3;

/**

  • Created by kikop on 2018/12/10.

*/

public class TxtDocument implements IDocument {

@Override

public void open() {

    System.out.println(this.getClass().toString()+":open.");

}

@Override

public void close() {

    System.out.println(this.getClass().toString()+":close.");

}

@Override

public void save() {

    System.out.println(this.getClass().toString()+":save.");

}

@Override

public void revert() {

    System.out.println(this.getClass().toString()+":revert.");

}

}

1.2.2.4.定义工厂方法接口

package com.tech.ability.mydesignpattern.mycreatepattern.FactoryMethod3;

/**

  • 定义工厂方法接口

  • 抽象类AbsDocumentFactory 代替接口 IDocumentFactory

  • Created by kikop on 2018/12/10.

*/

public abstract class AbsDocumentFactory {

/**

 * 执行

 * 通过抽象类中的方法定义执行顺序和逻辑

 */

public void exec() {

    IDocument iDocument = this.factoryMethod();

    iDocument.open();

    iDocument.save();

    iDocument.close();

}

/**

 * 模板方法

 *

 * @return

 */

public abstract IDocument factoryMethod();

}

1.2.2.5.定义Pdf工厂实现接口

package com.tech.ability.mydesignpattern.mycreatepattern.FactoryMethod3;

/**

  • Created by kikop on 2018/12/10.

*/

public class PdfDocumentFactory extends AbsDocumentFactory {

@Override

public IDocument factoryMethod() {

    return new PdfDocument();

}

}

1.2.2.6.定义Txt厂实现接口

package com.tech.ability.mydesignpattern.mycreatepattern.FactoryMethod3;

/**

  • Created by kikop on 2018/12/10.

*/

public class TxtDocumentFactory extends AbsDocumentFactory {

@Override

public IDocument factoryMethod() {

    System.out.println("new TxtDocumentFactory");

    return new TxtDocument();

}

}

1.2.2.7.工厂方法测试

package com.tech.ability.mydesignpattern.mycreatepattern.FactoryMethod3;

import com.tech.ability.mycommonutils.XmlUntil;

/**

  • 引入抽象类

  • Created by kikop on 2018/12/10.

*/

public class FactoryMethodTest {

public static void test1() throws Exception {

    AbsDocumentFactory absDocumentFactory = (TxtDocumentFactory) XmlUntil.getConfigBeanByName("factorymethodconfig.xml",

            "/config/className3");

    absDocumentFactory.exec();

}

public static void main(String[] args) throws Exception {

    test1();

}

}

1.2.3.****枚举单例的应用

package com.tech.ability.mydesignpattern.mycreatepattern.FactoryMethod4;

import java.io.Serializable;

/**

  • Created by kikop on 2018/12/10.

*/

public class TxtDocument implements IDocument,Serializable {

@Override

public void open() {

    System.out.println(this.getClass().toString() + ":open.");

}

@Override

public void close() {

    System.out.println(this.getClass().toString() + ":close.");

}

@Override

public void save() {

    System.out.println(this.getClass().toString() + ":save.");

}

@Override

public void revert() {

    System.out.println(this.getClass().toString() + ":revert.");

}

//如下是产品的单例生产方式_Begin

/**

 * 获取产品的单例对象

 *

 * @return

 */

public static TxtDocument getDocumentSingletonObj() {

    return TxtDocumentSingletonFactory.INSTANCE.getIntance();

}

/**

 * 通过枚举创建单例对象

 * 如果单例类需要反序列化且不能被反射

 * 那么可以使用写法枚举。

 * 目前最为安全的实现单例的方法是通过内部静态枚举的方法来实现

 * 因为JVM会保证enum不能被反射并且构造器方法只执行一次。

 */

private enum TxtDocumentSingletonFactory {

    //1.定义枚举实例

    INSTANCE;

    //2.私有枚举构造函数

    TxtDocumentSingletonFactory() {

        System.out.println(this.getClass().toString()+" singleobj create.");

        txtDocument = new TxtDocument();

    }

    //3.需要的真正单例对象

    private TxtDocument txtDocument = null;

    //4.获取真正单例对象

    public TxtDocument getIntance() {

        return txtDocument;

    }

}

// 如下是产品的单例生产方式_End

}

相关文章

  • 2019-01-20_工厂方法模式

    1.2.工厂方法模式(Factory Method Pattern) 场景:工厂方法模式主要是客户知道要实例化哪个...

  • 2019-01-20_抽象工厂模式

    1.3抽象工厂模式(Abstract Factory Pattern) 如果我们有这样一个需求:具体工厂1和工厂2...

  • 设计模式-3种工厂模式

    工厂模式包括:简单工厂模式,工厂方法模式,抽象工厂模式 简单工厂模式 工厂方法根据参数直接创建实例:工厂->产品 ...

  • 设计模式-工厂模式

    工厂模式概念 实例化对象,用工厂方法代替new操作。工厂模式包括工厂方法模式和抽象工厂模式。抽象工厂模式是工厂模式...

  • 设计模式-工厂方法模式

    1、工厂方法模式(Factory Method) 工厂方法模式分为三种: 普通工厂模式 多个工厂模式 静态工厂模式...

  • 设计模式 工厂模式

    工厂模式 工厂模式三大类1、简单工厂模式(静态工厂方法模式)2、工厂方法模式3、抽象工厂模式(Kit模式) 简单工...

  • python设计模式 - 工厂模式之工厂方法

    python 环境 工厂方法模式简介 工厂方法模式Factory Method,又称多态性工厂模式。在工厂方法模式...

  • 第一章2.0工厂- 基础类准备

    2.1工厂-简单工厂模式2.2工厂-工厂方法模式2.3工厂-抽象工厂模式

  • 建造模式

    包括:简单工厂、工厂方法、抽象工厂、单例模式、多例模式、建造模式、原始原型模式。 简单工厂:又名静态工厂方法模式,...

  • PHP-浅谈单例模式和工厂模式

    PHP中常用的设计模式有单例模式、工厂模式(简单工厂模式、工厂方法模式和抽象工厂方法模式)、适配模式、策略模式。 ...

网友评论

      本文标题:2019-01-20_工厂方法模式

      本文链接:https://www.haomeiwen.com/subject/iinxjqtx.html