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
}












网友评论