`
GavinZheng
  • 浏览: 16078 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

工厂方法(Factory mothod Pattern

 
阅读更多
工厂方法(Factory mothod Pattern)


工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

代码:
Product.java产品抽象类
package org.factoryMethod;
public abstract class Product {
//	公用的方法
	public void menthod1(){
		
	}
//	抽象方法
	public abstract void menthod2();
}

ConcreteProduct1.java具体产品类1
package org.factoryMethod;

public class ConcreteProduct1 extends Product {

	// 具体的业务逻辑
	@Override
	public void menthod2() {
		System.out.println("我是产品1");
	}
}



ConcreteProduct2.java具体产品类2
package org.factoryMethod;

public class ConcreteProduct2 extends Product {

	// 具体的业务逻辑
	@Override
	public void menthod2() {
		System.out.println("我是产品2");
	}
}



Creator.java定义一个工厂方法的接口
注意:采用泛型,通过泛型concreteCreator对输入参数产生两层限制:
1. 必须是Class类型;
2. 必须是Product的实现类。
减少对象间的转换,约束其输入参数的类型。
package org.factoryMethod;

public abstract class Creator {
	public abstract <T extends Product> T creatoProduct(Class<T> c);
}



ConcreteCreator.java工厂方法的实现
package org.factoryMethod;

public class ConcreteCreator extends Creator {

	@Override
	public <T extends Product> T creatoProduct(Class<T> c) {
		Product product = null;
		try {
			product = (Product) Class.forName(c.getName()).newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return (T) product;
	}
}


Client.java调试
package org.factoryMethod;

public class Client {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ConcreteCreator concreteCreator = new ConcreteCreator();
		Product product = null;
		product = concreteCreator.creatoProduct(ConcreteProduct1.class);
		product.menthod2();
		product = concreteCreator.creatoProduct(ConcreteProduct2.class);
		product.menthod2();
	}
}


输出结果:
我是产品1
我是产品2

注意:采用泛型,通过泛型concreteCreator对输入参数产生两层限制:
3. 必须是Class类型;
4. 必须是Product的实现类。
减少对象间的转换,约束其输入参数的类型。

工厂方法模式的应用
优点:
1. 良好封装性,代码结构清晰。
2. 扩展优秀。
3. 屏蔽产品类
4. 是典型的解耦框架。

工厂方法模式的扩展:
1. 简化的工厂方法:去除掉抽象的接口。将具体实现的方法改成静态static,客户端Client.java调用直接
product = ConcreteCreator.creatoProduct(ConcreteProduct1.class);

ConcreteCreator.java
package org.factoryMethod;

public class ConcreteCreator{
	public static <T extends Product> T creatoProduct(Class<T> c) {
		Product product = null;
		try {
			product = (Product) Class.forName(c.getName()).newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return (T) product;
	}
}


2. 升级为多个工厂类。即产品1,有一个其自己的工厂类,产品2也有其自己的工厂类。每个工厂类中可以直接使用new去创造其对象。

3. 替代单例模式:使用Java的反射机制

package org.factoryMethod.singletone;

public class Singletone {
	// 单例模式,该类参数私有化
	private Singletone() {
	}

	public void method1() {
		System.out.println("具体的逻辑业务");
	}
}


package org.factoryMethod.singletone;

import java.lang.reflect.Constructor;

public class SingletoneFactory {
	private static Singletone singletone;
	static {
		try {
			// 获取一个类的标识
			Class singletoneClass = Class.forName(Singletone.class.getName());
			// 获取该类的无参构造函数
			Constructor constructor = singletoneClass.getDeclaredConstructor();
			// 更改其访问权限,使其可以被访问
			constructor.setAccessible(true);
			// 实例化
			singletone = (Singletone) constructor.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static Singletone getSingletone() {
		return singletone;
	}
}


4. 延迟的初始化:一个对象被完毕后,并不立刻释放,工厂类保持其初始化状态,等待再次被使用。


package org.factoryMethod.lazy;

import java.util.HashMap;

public class ProductFactory{
	private static final HashMap<String, Product> pool = new HashMap<String, Product>();
	private static synchronized Product createProduct(String key){
		Product product = null;
//		如果Map中已有对象
		if(pool.containsKey(key)){
			product = pool.get(key);
		}
		else{
			if(key.equals("ConcreteProduct1")){
				product = new ConcreteProduct1();
			}
			else{
				product = new ConcreteProduct2();
			}
			pool.put(key, product);
		}
		return product;
	}
}

  • 大小: 18.5 KB
  • 大小: 20.8 KB
  • 大小: 32.1 KB
分享到:
评论

相关推荐

    Kernel method for Pattern Analysis

    《核方法在模式分析中的应用》一书深入探讨了核方法这一强大且统一的框架,该框架为神经网络、统计模式识别、机器学习、数据挖掘等领域的研究与实践提供了有力支持。模式分析作为数据集中发现普遍关系的过程,是众多...

    RMI(Remote Mothod Interface)规范

    **远程方法接口(RMI,Remote Method Interface)**是Java平台上的一个重要概念,它允许Java对象在不同的JVM(Java虚拟机)之间进行交互,从而实现分布式计算。RMI是Java语言中的一个标准API,由Java SE(标准版)...

    CPP-common-mothod.rar_数学计算_Visual_C++_

    在本资源"CPP-common-mothod.rar"中,我们聚焦于使用C++编程语言实现一些基本的数学计算方法。这些方法对于任何软件开发者,特别是那些在科学计算、数据分析或者算法设计领域工作的人来说,都是至关重要的基础技能。...

    论文 Minimum mean square error method for stripe nonuniformity correction

    ### 最小均方误差方法在条纹非均匀性校正中的应用 #### 一、引言 红外图像处理是现代成像技术中的一个重要分支,在军事侦察、民用监控、医学诊断等多个领域发挥着至关重要的作用。然而,由于制造工艺的限制以及...

    MIL-STD-202_215A_2020.pdf

    MIL-STD-202_215A_2020

    python dataframe向下向上填充,fillna和ffill的方法

    本文将详细介绍如何在DataFrame中使用fillna()和ffill()方法进行向下和向上填充缺失值的操作。 fillna()是DataFrame中用于填充缺失值(NaN或None)的一个函数,它可以接受多种填充策略。其中,ffill()(forward ...

    java-stepup:一种提高Java技能的方法

    final String API_MOTHOD = "register"; String url = HOST + API_PREF + API_MOTHOD; HttpPost httpPost = new HttpPost(url); List&lt;NameValuePair&gt; nvps = new ArrayList&lt;&gt;(); nvps.ad

    Modbus4Android-master.zip

    if you use RTU Mode with SerialPort,you should do : - 1. Create a class to implement SerialPortWrapper interface. ... Create a ModbusMaster instance with createRtuMaster mothod of ModbusFactory class.

    Distortions:图像失真工具

    ##推荐用法:import distrotions result1 =distortions.distort(top, base, 'method') result2 =distortions.distort(top, base, ['mothod_1', ... ,'method_n']) ##不推荐使用:导入失真结果1 =失真.mode_name(top...

    WebshellManager

    第二版本完成了自定义命令 在include\model\PHPShell_Build_mothod.php中自定义命令即可,将自动完成编码加密过程 var $phpshell = array( 'link' =&gt; '{PASS}=@eval&#40;base64_decode($_POST[z0]&#41;);&z0=',//\...

Global site tag (gtag.js) - Google Analytics