(java)工厂模式和策略模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yyyCHyzzzz/article/details/70147960

工厂模式

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

为了解耦还有后面的修改代码的过程中减少错误,所以用工厂来完成操作.

例子

我们平常都知道计算器吧,以计算器的加减乘除 来说明.

首先 我们定义一个抽象的操作类

里面定义了两个输入数 A B  定义了一个抽象的getResult() 方法  顾名思义 就是得到计算结果 给下层继承的类进行定制
public abstract class Operation {

	private double numberA;
	
	private double numberB;
	
	public abstract double getResult();
	
	//忽略set get
	
}

再定义加减乘除类 这些类都继承Operation抽象类

//加法操作类
public class OperatorAdd extends Operation{
	@Override
	public double getResult() {
		double result = this.getNumberA() + this.getNumberB();
		return result;
	}
}
//减法操作类
public class OperatorSub extends Operation{
	@Override
	public double getResult() {
		double result = this.getNumberA() - this.getNumberB();
		return result;
	}
}
//乘法操作类
public class OperatorMul extends Operation{
	@Override
	public double getResult() {
		double result = this.getNumberA() * this.getNumberB();
		return result;
	}
}

//除法操作类
public class OperatorDiv extends Operation {
	@Override
	public double getResult(){
		if (this.getNumberB() == 0){
			try {
				throw new Exception("除数为0");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		double result = this.getNumberA() / this.getNumberB();
		return result;
	}
}

好了 加减乘除的功能都写好 下面我们写一个计算的工厂类,要求的目标就是 传入一个运算符号 就返回所需要的计算类

public static Operation createOperate(String operate) {
		Operation oper = null;
		switch (operate) {
		case "+":
			oper = new OperatorAdd();
			break;
		case "-":
			oper = new OperatorSub();
			break;
		case "*":
			oper = new OperatorMul();
			break;
		case "/":
			oper = new OperatorDiv();
			break;
		}
		return oper;
}

用法:

Operation oper = OperationFactory.createOperate("+");
oper.setNumberA(1);
oper.setNumberB(2);
System.out.println(oper.getResult());

上述的就是我们所说的简单工厂的基础封装,简而言之 就是需要什么类型我们不需要再自己new xxxx() ,要什么 就从工厂里拿.

而对于的抽象工厂,可能会用的少一点,有兴趣可以自己网上看看.. 提供一个例子:

interface IProduct1 {  
    public void show();  
}  
interface IProduct2 {  
    public void show();  
}  
  
class Product1 implements IProduct1 {  
    public void show() {  
        System.out.println("这是1型产品");  
    }  
}  
class Product2 implements IProduct2 {  
    public void show() {  
        System.out.println("这是2型产品");  
    }  
}  
  
interface IFactory {  
    public IProduct1 createProduct1();  
    public IProduct2 createProduct2();  
}  
class Factory implements IFactory{  
    public IProduct1 createProduct1() {  
        return new Product1();  
    }  
    public IProduct2 createProduct2() {  
        return new Product2();  
    }  
}  
  
public class Client {  
    public static void main(String[] args){  
        IFactory factory = new Factory();  
        factory.createProduct1().show();  
        factory.createProduct2().show();  
    }  
}

策略模式

定义了一系列的算法,并将每一个算法封装起来,而且使它们可以相互替换。策略模式让算法独立于使用它的客户而独立变化.

首先 定义一个抽象的策略类

public abstract class Strategy {

	public abstract void algorithmIterface();//算法方法
}

再来定义一个环境类(Context)

public class Context {

	private Strategy strategy;
	public Context(Strategy strategy){
		this.strategy = strategy;
	}
	
	//上下文接口
	public void ContextInterface(){
		strategy.algorithmIterface();
	}
}

既然有了抽象的策略类,下面我们就可以继承并重写algorithmIterface()方法

public class ConcreteStrategyA extends Strategy {

	@Override
	public void AlgorithmIterface() {
		System.out.println("算法A");
	}

}
public class ConcreteStrategyB extends Strategy {
	@Override
	public void AlgorithmIterface() {
		System.out.println("算法B实现");
		
	}
}

用法:

public static void main(String[] args) {
		Context context = new Context(new ConcreteStrategyA());
		context.ContextInterface();
}

适用的地方

当存在以下情况时使用Strategy模式

1)许多相关的类仅仅是行为有异。 “策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。

2)需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间 时间权衡的算法。当这些变体实现为一个算法的类层次时 ,可以使用策略模式。

3)算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。

4) 一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

总结

简单工厂模式也可以和策略模式结合起来用,有兴趣可以看看

总之,如果别人能快速理解你的代码,就是好代码。代码的可读性不是非得使用设计模式。

参考:

  • 《大话设计模式》

猜你喜欢

转载自blog.csdn.net/yyyCHyzzzz/article/details/70147960