设计模式之工厂方法

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

类型:创建类模式

类图:


工厂方法实例(计算器):

 

该模式中包含的角色及其职责
工厂(Creator)角色
工厂方法定义创建各个实例的逻辑
具体工厂(Creator)角色
工厂方法模式的核心,它负责实现创建对应实例的内部逻辑实现。使得一个实例创建推迟子类进行。
抽象产品(Product)角色
工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
是工厂方法模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

抽象产品:操作类
package com.jin.model.simplefactory;

public abstract class Operation {
	protected double number1;
	protected double number2;

	public double getNumber1() {
		return number1;
	}

	public void setNumber1(double number1) {
		this.number1 = number1;
	}

	public double getNumber2() {
		return number2;
	}

	public void setNumber2(double number2) {
		this.number2 = number2;
	}
	
	public abstract double getResult();

}
具体产品:
加法操作:
package com.jin.model.simplefactory;

public class OperationAdd extends Operation {

	@Override
	public double getResult() {
		return number1 + number2;
	}
}
减法操作
package com.jin.model.simplefactory;

public class OperationSub extends Operation {

	@Override
	public double getResult() {
		return number1 - number2;
	}
}
乘法操作:
package com.jin.model.simplefactory;

public class OperationMul extends Operation {

	@Override
	public double getResult() {
		return number1 * number2;
	}
}

除法操作:
package com.jin.model.simplefactory;

public class OperationDiv extends Operation {

	@Override
	public double getResult() {
		return number1 / number2;
	}
}

抽象工厂类:
package com.jin.model.factorymethod;

public interface IFactory {
	public Operation createOperation();
}
加法工厂类:
package com.jin.model.factorymethod;

public class AddFactory implements IFactory {

	@Override
	public Operation createOperation() {
		return new OperationAdd();
	}
}

减法工厂类:
package com.jin.model.factorymethod;

public class SubFactory implements IFactory {

	@Override
	public Operation createOperation() {
		return new OperationSub();
	}
}

乘法工厂类:
package com.jin.model.factorymethod;

public class MulFactory implements IFactory {

	@Override
	public Operation createOperation() {
		return new OperationMul();
	}
}

除法工厂类:
package com.jin.model.factorymethod;

public class DivFactory implements IFactory {

	@Override
	public Operation createOperation() {
		return new OperationDiv();
	}
}


客户端:测试
package com.jin.model.factorymethod;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		IFactory factory = new MulFactory();
		Operation operation = factory.createOperation();
		operation.setNumber1(2);
		operation.setNumber2(4);
		System.out.println(operation.getResult());
	}
}

实现要点

1.Factory Method模式的两种情况:一是Creator类是一个抽象类且它不提供它所声明的工厂方法的实现;二是Creator是一个具体的类且它提供一个工厂方法的缺省实现。

2.工厂方法是可以带参数的。

3.工厂的作用并不仅仅只是创建一个对象,它还可以做对象的初始化,参数的设置等。

优点

1.用工厂方法在一个类的内部创建对象通常比直接创建对象更灵活。

2.Factory Method模式通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。

适用性

在以下情况下,适用于工厂方法模式:

1.  当一个类不知道它所必须创建的对象的类的时候。

2.  当一个类希望由它的子类来指定它所创建的对象的时候。

3.  当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

总结

Factory Method模式是设计模式中应用最为广泛的模式,通过本文,相信读者已经对它有了一定的认识。然而我们要明确的是:在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。Factory Method要解决的就是对象的创建时机问题,它提供了一种扩展的策略,很好地符合了开放封闭原则。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值