跟着实例学习设计模式(2)-静态工厂(创建型)

原创 2015年07月09日 21:22:49

静态工厂设计模式是创建型设计模式。

设计意图:实例化出我们需要的类对象,这些对象可以实现不同的功能,也可能只实现一个功能!

类图关系:

通过类图关系我们可以看到静态工厂负责创建OperationFather类的对象,我们来看一下实例代码。

我们是想实现一个计算器,计算器的功能暂时有加法、减法功能,以后可能随时增加新的功能如乘法、除法等。如果使用一般的做法,实际上我们写一个类就可以实现。

package com.factory.staticfactory;

/**
 * @author gaoxu
 * 实践出真知!
 */
public class Operation {

	/**
	 * @author gaoxu
	 * @param args
	 */
	public static void main(String[] args) {
		
		//定义变量
		//获取传入的参数
		//判断传入的计算类型
		if("".equals("+")){
			
		}else if("".equals("-")){
			
		}
		
		//输出计算结果
	}

}

大家看一下这个实现,基本的功能肯定是实现了,但是好像扩展性很差,如果我们需要加一个乘法,那只能修改if语句增加条件,如果不断增加新的计算功能,那么这个类就不能维护了,什么样的方式才能让代码漂亮,功能扩展灵活,维护方便呢?

面向对象编程可以实现,首先我们需要封装计算的实现、其次我们需要解耦数据获取设置与计算的逻辑、还要考虑增加功能方便快捷。这几点实现了,我们也就可以实现代码漂亮,功能扩展灵活、代码维护方便的几个需求了。

首先我们把计算进行封装,我们把数据处理放到父类中把计算放到不同的子类中。

package com.factory.staticfactory;

/**
 * @author gaoxu
 * 实践出真知!
 */
public class OperationFather {
	
	double numA = 0;
	double numB = 0;
	public double getNumA() {
		return numA;
	}
	public void setNumA(double numA) {
		this.numA = numA;
	}
	public double getNumB() {
		return numB;
	}
	public void setNumB(double numB) {
		this.numB = numB;
	}
	
	public double getResult() {
		// TODO Auto-generated method stub
		return 0;
	}

}

package com.factory.staticfactory;

/**
 * @author gaoxu
 * 实践出真知!加法
 */
public class OperationAdd extends OperationFather{
	@Override
	public double getResult(){
		double result=0;
		result = numA +numB;
		return result;
	}
}

package com.factory.staticfactory;

/**
 * @author gaoxu
 * 实践出真知!减法
 */
public class OperationSub extends OperationFather{
	@Override
	public double getResult(){
		double result=0;
		result = numA -numB;
		return result;
	}
}

我们看到上面三个类,有一个父类负责设置数据,并提供了计算的方法。下面的两个子类一个加法类、一个减法类,它们各个实现自己的业务逻辑(重写了父类的方法),这样做的好处是,每增加一个功能点都不会修改到别的功能的代码。

我们现在做的就是要根据用户的需要创建出不同的功能产品来,这时可以使用静态工厂了,来看工厂类的实现。

package com.factory.staticfactory;

/**
 * @author gaoxu
 * 实践出真知!
 */
public class StaticFactory {
	
	public static OperationFather getOperationByType(String type){
		
		OperationFather operation = null;
		if("+".equals(type)){
			operation = new OperationAdd();
		}else if("-".equals(type)){
			operation = new OperationSub();
		}
		return operation;
		
	}

}

大家看到了,我们把执行什么操作的判断挪到了工厂的方法里了,我们使用工厂封装了创建对象的过程,静态方法的功能就是根据传入的参数来创建不同功能的实例对象。创建对象也实现了,那么再来看如何调用吧!

package com.factory.staticfactory;

/**
 * @author gaoxu
 * 实践出真知!
 */
public class StaticFactoryClient {
	
	public static void main(String[] para){
		StaticFactory factory = new StaticFactory();
		String operatType = "-";
		OperationFather operate = factory.getOperationByType(operatType);
		if(operate!=null){
			operate.setNumA(1);
			operate.setNumB(5);
			System.out.println("两数相"+operatType+",结果如下:"+operate.getResult());
		}else{
			System.out.println("操作类创建失败!");
		}
		
		
	}

}

我们可以看到客户端的代码也相当简洁,而且可以很明确知道这个类要干什么,根本不用关心是由谁来干。(这一点由功能来决定要哪个对象来干)

由以上代码我们可以看出:

客户端--工厂类--计算实现类

这三块的关系,各自有自己要做的业务,耦合性极低,功能扩展性增强,如果增加新的功能只需要实现一个计算类,修改工厂静态方法的判断逻辑,由此我们实现了代码简洁、功能扩展灵活、维护方便的需求。

什么场景下适合使用工厂模式创建:

1:对象需要很复杂的创建过程,在客户端创见过于负责。

2:不同的对象可以实现不同功能,需要有很强的扩展需求时。

我们把对象的创建交给工厂类来实现,有如下优点(相对于不使用工厂的实现来说):

1:创建产品的过程被封装起来,通过必要的逻辑判断实现动态实例化相关的类对象,精简客户端的代码,去除了客户端与具体产品的依赖。

2:可以有效解耦,客户端和具体实现功能的类之间没有直接的创建耦合关系。

3:可以很好的复用功能,灵活的添加功能,添加产品只需要修改工厂逻辑和加产品实现类。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

跟着实例学习设计模式(5)-工厂方法 、抽象工厂的区别

工厂方法和抽象工厂都属于工厂模式,那么它们到底有什么区别呢?让我们来比较一下,首先我们从工厂接口的角度来分析一下。 工厂方法:               &#...

跟着实例学习设计模式(9)-桥接模式bridge(结构型)

桥接模式属于结构型设计模式。 设计意图:将抽象部分与实现部分分离,使它们都可以独立的变化。 一看到设计意图,大家可能有些发懵,我们看到的继承和接口不都是抽象和实现分离的吗?尤其是接口和抽象类都是这样的...

跟着实例学习设计模式(4)-抽象工厂(创建型)

抽象工厂属于创建型设计模式 设计意图:提供一个接口,可以创建一系列相关或相互依赖的对象,而无须指定它们具体的类。 光看设计意图有些抽象,不好理解,让我们来看一下实例类图,结合类图我们再做具体的解释,相...

跟着实例学习设计模式(3)-工厂方法(创建型)

工厂方法属于创建型设计模式。 设计意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。        静态工厂使用面向对象的方式,有效的解决了增加新产品...

跟着实例学习设计模式(1)-单例模式(创建型)

单例模式属于创建型设计模式。   设计意图:保证一个类只有一个实例,并提供一个访问它的全局访问点。   单例模式根据单例,一种是懒汉式单例。饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用...

跟着实例学习设计模式(6)-生成器模式builder(创建型)

生成器模式是创建型设计模式。 设计意图:将一个复杂的类表示与其构造相分离,使得相同的构建过程能够得出不同的表示。 实例类图: IVehicleBuilder:抽象建造者,为创建一个Vehicle对...

跟着实例学习设计模式(7)-原型模式prototype(创建型)

原型模式是创建型模式。 设计意图:用原型实例指定创建对象的类型,并通过拷贝这个原型来创建新的对象。 我们使用构建简历的例子的类图来说明原型模式。 类图: 原型模式主要用于对象的复制,它的核心是...

跟着实例学习设计模式(8)-适配器模式adapter(结构型)

适配器模式属于结构型设计模式 设计意图:将一个类的接口转换成客户希望的另外一个接口。A d a p t e r模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 该模式正如名字一样适配器,...

Java技术_每天掌握一种设计模式(003)_使用场景及简单实例(创建型:工厂方法)

模式描述 提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。 2.模式作用 可以一定程度上解耦,消费者和产品实现类隔离开...

Java技术_每天掌握一种设计模式(004)_使用场景及简单实例(创建型:抽象工厂)

模式描述 提供一个用于创建一系列相关或相互依赖对象(产品族)的接口(抽象工厂),而无须指定它们的具体类。 2.模式作用 可以一定程度上解耦,消费者和产品实现类隔离开,只依赖产品接口(抽象产品),产...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)