`

设计模式——简单工厂 VS 工厂方法

    博客分类:
  • java
 
阅读更多

 简单工厂模式:

它最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关的类, 对于客户端来说,去除了与具体产品的依赖。

 

使用了封装、继承、多态面向对象的三大特性,能做到灵活的修改和扩展,如要修改加法运算,或添加开根号运算,只需添加一个开根号运算的类,并在工厂中的switch case加一分支即可

 

工厂方法模式:

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

 

工厂方法模式实现时,客户端需要决定实例化那个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。想要加功能,本来是改工厂类的,而现在是修改客户端。

 

工厂方法模式是简单工厂的进一步抽象和推广,由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但缺点是由于每加一个产品都需要加一个产品工厂类,增加了额外的开发量。

 

实例

实现加减乘除运算

Operation类:

package cn.edu.tju.simpleFactoryPattern;

public class Operation {
	
	protected double a = 0;
	protected double b = 0;
	
	public double getA() {
		return a;
	}

	public void setA(double a) {
		this.a = a;
	}

	public double getB() {
		return b;
	}

	public void setB(double b) {
		this.b = b;
	}

	public double getResult() throws Exception{
		return 0;
	}
}
 

继承Operation类,覆盖getResult方法

加法:

package cn.edu.tju.simpleFactoryPattern;

public class AddOperation extends Operation{
	
	public double getResult(){
		
		return a + b;
		
	}

}

 减法:

package cn.edu.tju.simpleFactoryPattern;

public class SubtractOperation extends Operation{
	
	public double getResult(){
		return a - b;
	}

}

 乘法:

package cn.edu.tju.simpleFactoryPatern;

public class MultiplyOperation extends Operation{
	
	public double getResult(){
		return a * b;
	}
}

 除法:

package cn.edu.tju.simpleFactoryPattern;

public class DivideOperation extends Operation{
	
	public double getResult() throws Exception{
		if (b == 0){
			throw new Exception("b can not be zero!");
		}
		return a / b;
	}
}

 工厂类,包含必要的逻辑判断

package cn.edu.tju.simpleFactoryPattern;

public class OperationFactory {
	
	public static Operation createOperation(char type){
		Operation oper = null;
		switch(type){
		case '+':
			oper = new AddOperation();
			break;
		case '-':
			oper = new SubtractOperation();
			break;
		case '*':
			oper = new MultiplyOperation();
			break;
		case '/':
			oper = new DivideOperation();
			break;
		}
		return oper;
	}

}

 测试类

package cn.edu.tju.simpleFactoryPattern;

import java.util.Scanner;

/*
 * 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关的类,
 * 对于客户端来说,去除了与具体产品的依赖。
 */
public class Test {

	public static void main(String[] args) throws Exception {

		Scanner scanner = new Scanner(System.in);
		while (System.in != null) {
			System.out.print("Please input the formula: ");
			double a = scanner.nextDouble();
			char o = scanner.next().toCharArray()[0];
			double b = scanner.nextDouble();

			Operation oper = OperationFactory.createOperation(o);
			oper.a = a;
			oper.b = b;
			double result = oper.getResult();
			System.out.println("The result is " + result);
		}
	}

}
 

工厂方法模式:

运算类不变,把工厂类改为接口,并实现不同的工厂,从而产生不同的产品

工厂接口:

package cn.edu.tju.factoryMethodPattern;

public interface OperationFactory {
	
	public Operation createOperation();

}

 加法工厂:

package cn.edu.tju.factoryMethodPattern;

public class AddOperationFactory implements OperationFactory{

	@Override
	public Operation createOperation() {
		// TODO Auto-generated method stub
		return new AddOperation();
	}

}

 加法工厂:

package cn.edu.tju.factoryMethodPattern;

public class SubtractOperationFactory implements OperationFactory{

	@Override
	public Operation createOperation() {
		// TODO Auto-generated method stub
		return new SubtractOperation();
	}

}

 乘法工厂:

package cn.edu.tju.factoryMethodPattern;

public class MultiplyOperationFactory implements OperationFactory {

	@Override
	public Operation createOperation() {
		// TODO Auto-generated method stub
		return new MultiplyOperation();
	}

}

 除法工厂

package cn.edu.tju.factoryMethodPattern;

public class DivideOperationFactory implements OperationFactory{

	@Override
	public Operation createOperation() {
		// TODO Auto-generated method stub
		return new DivideOperation();
	}
	

}

 修改测试类

package cn.edu.tju.factoryMethodPattern;

import java.util.Scanner;

/*
 * 工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类,使得一个类的实例化延迟到其子类。
 * 
 * 工厂方法模式实现时,客户端需要决定实例化那个工厂来实现运算类,选择判断的问题还是存在的,也就是说,
 * 工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。想要加功能,本来是改工厂类的,而现在是修改客户端。
 * 
 * 工厂方法模式是简单工厂的进一步抽象和推广,由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服
 * 了它的缺点。但缺点是由于每加一个产品都需要加一个产品工厂类,增加了额外的开发量。
 */
public class Test {

	public static void main(String[] args) throws Exception {

		Scanner scanner = new Scanner(System.in);
		while (System.in != null) {
			System.out.print("Please input the formula: ");
			double a = scanner.nextDouble();
			char o = scanner.next().toCharArray()[0];
			double b = scanner.nextDouble();
			OperationFactory operFactory = null;
			
			switch(o){
			case '+':
				operFactory = new AddOperationFactory();
				break;
			case '-':
				operFactory = new SubtractOperationFactory();
				break;
			case '*':
				operFactory = new MultiplyOperationFactory();
				break;
			case '/':
				operFactory = new DivideOperationFactory();
				break;
			}
			
			Operation oper = operFactory.createOperation();
			oper.a = a;
			oper.b = b;
			double result = oper.getResult();
			System.out.println("The result is " + result);
		}
	}

}
 

 

分享到:
评论

相关推荐

    设计模式——简单工厂模式

    **设计模式——简单工厂模式** 简单工厂模式是创建型设计模式的一种,它提供了一种创建对象的最佳方式。在简单工厂模式中,一个专门的类(称为工厂类)负责创建对象,客户端无需知道所创建的对象的具体类,只需要...

    设计模式——工厂方法模式

    工厂方法模式是面向对象设计模式中的一种,它属于创建型模式,主要解决的是当系统需要创建的对象具有多种类型,而具体创建哪种类型的对象在运行时才能确定的问题。在这个压缩包中,`FactoryMethod`可能包含了Java...

    实验二 简单工厂模式.zip_31QS_C#_设计模式——简单工厂模式_设计模式实验

    简单工厂模式是软件设计模式中的一种基础模式,它属于创建型模式,主要解决对象的创建问题,降低了客户端代码与具体产品类之间的耦合度。在本实验中,我们将深入理解和应用C#语言实现简单工厂模式。 简单工厂模式的...

    设计模式——抽象工厂模式

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体类。这种模式的主要目的是为了隔离产品对象的创建和使用,使得系统对产品类的依赖降低到最低,同时也方便了产品的扩展和...

    软件设计模式——抽象工厂

    抽象工厂模式是一种重要的软件设计模式,它属于创建型模式,主要解决的是当系统需要创建一系列相关或相互依赖的对象时,而这些对象的类在运行时可能不确定的问题。在这个模式中,我们通过一个抽象工厂接口来定义创建...

    c#工厂模式——简单工厂,抽象工厂,单件模式实例

    在软件设计模式中,工厂模式是一种非常常见的创建型模式,它提供了一种创建对象的最佳方式。C#中的工厂模式分为简单工厂、抽象工厂和单例模式三种,每一种都有其特定的应用场景和优势。 1. **简单工厂模式**: ...

    c#工厂模式——简单工厂_抽象工厂实例

    ### C#工厂模式详解——简单工厂与抽象工厂实例解析 #### 一、工厂模式概述 工厂模式是一种常用的设计模式,在面向对象编程中被广泛应用于创建对象。它通过提供一个统一的接口来创建一系列相关的或相互依赖的对象...

    设计模式——工厂模式在开发中的应用(简单计算器)

    这个是http://blog.csdn.net/dawanganban/article/details/9884681博客中java设计模式的源代码。下载前请先看《设计模式——工厂模式在开发中的应用》一文。

    Android之大话设计模式——:抽象工厂模式借鉴.pdf

    Android之大话设计模式——:抽象工厂模式借鉴.pdf

    设计模式C#描述之——简单工厂模式

    ### 设计模式C#描述之——简单工厂模式 #### 知识点概述 简单工厂模式是一种常用的设计模式,属于创建型模式之一。该模式的主要目的是为了封装产品对象的创建过程,将这一过程从客户端分离出来,使客户端无须关心...

    Android之大话设计模式——:抽象工厂模式参考.pdf

    Android之大话设计模式——:抽象工厂模式参考.pdf

    设计模式(简单工厂和工厂方法C++版)Demo程序

    本Demo程序主要涵盖了两种常用的创建型设计模式——简单工厂模式(Simple Factory)和工厂方法模式(Factory Method)。这两种模式都是用来创建对象,但它们在灵活性和抽象程度上有所不同。 简单工厂模式是一种静态...

    设计模式——GFour

    《设计模式——GFour》是一本深受IT从业者喜爱的经典书籍,尤其在C++开发者中具有广泛影响力。设计模式是软件工程领域中的一种最佳实践,它总结了在特定情境下解决问题的常见方法,使得代码可读性更强,复用性更高,...

    设计模式——刘伟

    分为简单工厂、工厂方法和抽象工厂三种类型。 3. **观察者模式**:定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在事件驱动编程中广泛使用,例如GUI组件...

    设计模式实现——抽象工厂模式结构实现

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许客户端使用一个通用接口来创建一组相关或相互依赖的对象,而无需关心它们的具体实现。在Java或其他...

    C#设计模式(3)——工厂方法模式.pdf

    工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此 时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许 系统不修改工厂类...

    设计模式——基于C#的工程化实现及扩展

    ### 设计模式——基于C#的工程化实现及扩展 #### 概述 本书旨在向读者展示如何利用C# 2.0语法有效地实现和应用设计模式,使其不仅仅局限于简单的例子,而是能够在实际工程项目中发挥重要作用。全书分为七个部分,...

    Java设计模式——工厂设计模式详解

    Java设计模式——工厂设计模式详解 在软件设计中,工厂设计模式是一种常用的设计模式,主要用于实例化有共同接口的类。Java设计模式——工厂设计模式是Java中的一种常用的设计模式,主要用于实例化有共同接口的类。...

    设计模式——原版的设计模式

    设计模式是一种在软件设计中被广泛认可的解决特定问题、经过良好记录并可重用的解决方案。它们代表了在各种编程环境中反复出现的问题的最佳实践。原版的设计模式通常指的是最初由“Gang of Four”(GoF)在他们的...

Global site tag (gtag.js) - Google Analytics