zoukankan      html  css  js  c++  java
  • 简单工厂设计模式

    简单工厂设计模式:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

    实现方式:

    简单工厂模式的UML类图

    简单工厂实际上是由一个工厂类(Factory)根据传进来的参数不同,动态实例化不同的对象,这些对象都继承自某一个接口或父类。其原理是根据java三大特性中的多态,将子类对象向上转型为父类对象,这样就可以利用父类对象实例化出不同的子类对象,然后调用子类中的方法(该方法具有不同的实现)

    优点

    工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化

    缺点

    由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
    当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
    代码例子:
    Operation(运算父类)类
    public class Operation {
    	private double numberA;
    	private double numberB;
    	public double getNumberA() {
    		return numberA;
    	}
    	public void setNumberA(double numberA) {
    		this.numberA = numberA;
    	}
    	public double getNumberB() {
    		return numberB;
    	}
    	public void setNumberB(double numberB) {
    		this.numberB = numberB;
    	}
    	public double GetResult() {
    		double result=0;
    		return result;
    	}
    }
    

    addOperation(加法)类

    public class addOperation extends Operation {
    	
    	@Override
    	public double GetResult() {
    		double result=0;
    		result = getNumberA()+getNumberB();
    		return result;
    	}
    }
    

    SubOperation(减法)类

    public class SubOperation extends Operation{
    	@Override
    	public double GetResult() {
    		double result=0;
    		result = getNumberA() - getNumberB();
    		return result;
    	}
    }
    

    MulOperation(乘法)类

    public class MulOperation extends Operation{
    	@Override
    	public double GetResult() {
    		double result=0;
    		result = getNumberA() * getNumberB();
    		return result;
    	}
    }
    

    OperationFactory(运算工厂类)

    public class OperationFactory {
    	public static Operation createOperation(String operate) {
    		Operation operation = null;
    		switch (operate) {
    		case "+":
    			operation = new addOperation();
    			break;
    		case "-":
    			operation = new SubOperation();
    			break;
    		case "*":
    			operation = new MulOperation();
    			break;
    		}
    		return operation;
    	}
    }
    

    Main类

    public class Main {
    
    	public static void main(String[] args) {
    		Operation operation1;
    		operation1 = OperationFactory.createOperation("+");
    		operation1.setNumberA(10);
    		operation1.setNumberB(20);
    		double result1 = operation1.GetResult();
    		System.out.println("10 + 20 = " + result1);
    		
    		Operation operation2;
    		operation2 = OperationFactory.createOperation("-");
    		operation2.setNumberA(10);
    		operation2.setNumberB(20);
    		double result2 = operation2.GetResult();
    		System.out.println("10 - 20 = " + result2);
    		
    		Operation operation3;
    		operation3 = OperationFactory.createOperation("*");
    		operation3.setNumberA(10);
    		operation3.setNumberB(20);
    		double result3 = operation3.GetResult();
    		System.out.println("10 * 20 = " + result3);
    	}
    
    }
    

    运算结果

  • 相关阅读:
    target runtime apache v6.0 not defined解决
    java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;
    The valid characters are defined in RFC 7230 and RFC 3986问题
    invalid END header解决方法
    You have more than one version of ‘org.apache.commons.logging.Log’ visible, which is not allowed问题解决
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    在eclipse中import java web项目时遇到的一些问题并将该项目通过tomcat发布
    java byte转string 涉及到字节流中有中文
    spring+mybatis框架搭建时遇到Mapped Statements collection does not contain value for...的错误
    试试看读一下Zepto源码
  • 原文地址:https://www.cnblogs.com/czsy/p/10108792.html
Copyright © 2011-2022 走看看