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

2019-01-20  本文已影响0人  kikop

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;

/**

*/

public interface IDocument {

/**

 * 打开

 */

void open();

/**

 * 关闭

 */

void close();

/**

 * 保存

 */

void save();

/**

 * 撤销

 */

void revert();

}

1.2.2.2.定义Pdf文档实现接口

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

/**

*/

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;

/**

*/

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;

/**

*/

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;

/**

*/

public class PdfDocumentFactory extends AbsDocumentFactory {

@Override

public IDocument factoryMethod() {

    return new PdfDocument();

}

}

1.2.2.6.定义Txt厂实现接口

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

/**

*/

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;

/**

*/

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;

/**

*/

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

}

上一篇 下一篇

猜你喜欢

热点阅读