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

例:设计程序实现加减乘除,并容易扩展其他运算方式
工厂具有逻辑判断功能,一个工厂实现不同类的创建

方法一:简单工厂模式

在这里插入图片描述工厂代码:

class operationfactory
{
	public static operation creationoperation(String operation)
	{
		operation oper=null;
		switch(operation)
		{
		  case "+":oper=new add1();break;
		  case "-":oper=new subtract();break;
		  case "*":oper=new ride();break;
		  case "/":oper=new divided();break;
		}
		return oper;
	}
}

源代码:

package org.yunan.design;

import java.util.Scanner;

public class simplefactory {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
      Scanner sc=new Scanner(System.in);
      operation oper;
      System.out.println("输入操作符");
      oper= operationfactory.creationoperation(sc.next());
      System.out.println("输入第一个操作数");
      oper.num1=sc.nextDouble();
      System.out.println("输入第二个操作数");
      oper.num2=sc.nextDouble();
      System.out.println( "运算结果:"+oper.Getresult());
      
      
	}

}
abstract class operation
{
	public double num1,num2;
	public abstract double Getresult();
}

class add1 extends operation
{

	@Override
	public double Getresult() {
		// TODO Auto-generated method stub
		return num1+num2;
	}
}
class subtract extends operation
{

	@Override
	public double Getresult() {
		// TODO Auto-generated method stub
		return num1-num2;
	}
}
class ride extends operation
{

	@Override
	public double Getresult() {
		// TODO Auto-generated method stub
		return num1*num2;
	}
}
class divided extends operation
{

	@Override
	public double Getresult() {
		// TODO Auto-generated method stub
		return num1/num2;
	}
}
class operationfactory
{
	public static operation creationoperation(String operation)
	{
		operation oper=null;
		switch(operation)
		{
		  case "+":oper=new add1();break;
		  case "-":oper=new subtract();break;
		  case "*":oper=new ride();break;
		  case "/":oper=new divided();break;
		}
		return oper;
	}
}

优点

(1)简单工厂包含必要的判断逻辑,简单工厂实现了对象的创建和使用的分离。
(2)客户端无需知道所创建的具体产品类的类名,只需要具体产品类对应的参数即可!
(3)在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性
缺点

(1)工厂类的职责过重,从类图中可以看出简单工厂中包含加减乘除的逻辑判断语句,它一旦有问题,整个系统都要出问题
(2)在添加新的类的时候,例如我添加了开根号运算,那么系统中的简单工厂类就要修改,违反了开放——封闭原则!这样及其不利于系统的扩展和维护!
(3)简单工厂的静态方法,使得工厂角色无法形成基于继承的等级结构!

改进:对工厂类实现分类实现单一职责原则,开闭原则,防止源代码的过度曝光;每一种算法都对应一个工厂

方法二 :工厂模式

在这里插入图片描述工厂类代码:

interface operationfactory
{
	operation creationoperation();
}
class add1factory implements operationfactory
{

	@Override
	public operation creationoperation() {
		// TODO Auto-generated method stub
		return new add1();
	}
}
class subtractfactory implements operationfactory
{

	@Override
	public operation creationoperation() {
		// TODO Auto-generated method stub
		return new subtract() ;
	}
	
}
class ridefactory implements operationfactory
{

	@Override
	public operation creationoperation() {
		// TODO Auto-generated method stub
		return new ride();
	}
	
}
class dividedfactory implements operationfactory
{

	@Override
	public operation creationoperation() {
		// TODO Auto-generated method stub
		return new divided();
	}
	
}

源代码:

package org.yunan.design;

import java.util.Scanner;

public class factory {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
      Scanner sc=new Scanner(System.in);
      operationfactory operfactory=null;
      System.out.println("输入操作符");
      switch(sc.next())
		{
		  case "+":operfactory=new add1factory();break;
		  case "-":operfactory=new subtractfactory();break;
		  case "*":operfactory=new ridefactory();break;
		  case "/":operfactory=new dividedfactory();break;
		}
      operation oper=operfactory.creationoperation();
      System.out.println("输入第一个操作数");
      oper.num1=sc.nextDouble();
      System.out.println("输入第二个操作数");
      oper.num2=sc.nextDouble();
      System.out.println( "运算结果:"+oper.Getresult());
      
      
	}

}
abstract class operation
{
	public double num1,num2;
	public abstract double Getresult();
}

class add1 extends operation
{

	@Override
	public double Getresult() {
		// TODO Auto-generated method stub
		return num1+num2;
	}
}
class subtract extends operation
{

	@Override
	public double Getresult() {
		// TODO Auto-generated method stub
		return num1-num2;
	}
}
class ride extends operation
{

	@Override
	public double Getresult() {
		// TODO Auto-generated method stub
		return num1*num2;
	}
}
class divided extends operation
{

	@Override
	public double Getresult() {
		// TODO Auto-generated method stub
		return num1/num2;
	}
}
interface operationfactory
{
	operation creationoperation();
}
class add1factory implements operationfactory
{

	@Override
	public operation creationoperation() {
		// TODO Auto-generated method stub
		return new add1();
	}
}
class subtractfactory implements operationfactory
{

	@Override
	public operation creationoperation() {
		// TODO Auto-generated method stub
		return new subtract() ;
	}
	
}
class ridefactory implements operationfactory
{

	@Override
	public operation creationoperation() {
		// TODO Auto-generated method stub
		return new ride();
	}
	
}
class dividedfactory implements operationfactory
{

	@Override
	public operation creationoperation() {
		// TODO Auto-generated method stub
		return new divided();
	}
	
}

优点:

(1)工厂方法用来创建客户所需要的产品,同时隐藏了哪种具体产品类将被实例化的细节,用户只需要要关注工厂,不需要关注创建的细节!从客户端代码就可以看出!只知道对应的工厂就好!
(2)在增加修改新的运算类的时候不用修改代码,只需要增加对应的工厂就好,完全符合开放——封闭性原则!
(3)创建对象的细节完全封装在具体的工厂内部,而且有了抽象的工厂类,所有的具体工厂都继承了自己的父类!完美的体现了多态性!
缺点:
(1)在增加新的产品(对应UML图的算法)时,也必须增加新的工厂类,会带来额外的开销
(2)抽象层的加入使得理解程度加大

以上部分摘取自朱红梅老师2020年5月的课件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yu_Nan___

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值