一.什么是工厂模式
工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类
二.工厂模式的写法
1.简单的工厂模式
我们来看下具体的写法:
接口类;
public interface Calculate {
double calulate(double x,double y);
}
实现类:
public class Minus implements Calculate{
@Override
public double calulate(double x,double y) {
double result=x-y;
System.out.println("Minus Result:"+result);
return result;
}
}
public class Plus implements Calculate {
@Override
public double calulate(double x, double y) {
double result=x+y;
System.out.println("Plus Result:"+result);
return result;
}
}
工厂的创建:
/**
* 简单工厂模式
* @author Seven
*
*/
public class Factory {
/** 根据需求创建不同的对象
* @param cal
* @return
*/
public static Calculate createCalculate(String cal) {
switch (cal) {
case "plus":
return new Plus();
case "minus":
return new Minus();
default:
break;
}
return null;
}
}
客户端调用:
public class Client {
public static void main(String[] args) {
Factory.createCalculate("plus").calulate(2, 1);
Factory.createCalculate("minus").calulate(2, 1);
}
}
打印结果:
Plus Result:3.0
Minus Result:1.0
简单工厂的好处,就是在创建对象的时候给出了判断的必要,根据客户端动态根据条件生成所需要的对象,祛除了对具体产品的依赖。不过这样貌似在修改的时候增加了一些麻烦,比如我们要新加一个具体实现类的时候,是不是要修改工厂里面的方法。这样就违背了设计模式的开闭原则,虽然我们扩展开放了,但是我们修改也开放了,所以我们要把工厂方法给抽象出去,于是就有了下面的工厂方法模式
2.工厂方法模式
我们接着上面说,如果我们此时要加另外一个算法,是不是要去修改简单工厂类,这样其实已经违背了设计原则,于是我们将工厂类也抽象出来,于是便有了下面的UML类图:
大致说下思路,这样抽象出来的好处,就是我们无论扩展多少个都不用去修改工厂的方法,只需要新建一个算法类去实现算法接口,然后新建一个具体实现工厂类去继承这个抽象工厂返回新建的算法对象即可。
这里贴一下抽象工厂和具体实现类:
public abstract class Factory {
public abstract Calculate createCalulate();
}
具体创建工厂:
public class DivFactory extends Factory {
@Override
public Calculate createCalulate() {
return new Div();
}
}
客户端调用
public class Client {
public static void main(String[] args) {
Factory factory=new DivFactory();
Calculate div=factory.createCalulate();
div.calulate(6, 2);
}
}
打印结果
Div Result:3.0
3.抽象的工厂模式它的定义就是提供一个创建一系列相关或相互依赖的对象的接口,而无需指定他们具体的类,就拿上面的例子来说,我们的Factory里面只提供一个抽象方法来生成计算的工厂,如果要生成其他类型的工厂呢,所以把生成的对象的接口添加到Factory中,这样就是基本的抽象工厂模式了。
三.思维拓展
我们可以尝试用反射加简单工厂来实现对象的创建,这里就不具体介绍了。可以参考我之前写的一篇反射注解的总结,自己写一写。
四.总结
本文介绍了什么是工厂模式以及工厂模式的常见写法,如果本文对你有用,可以点个赞,如果有不正之处,欢迎留下你的评论,谢谢!