前言
工厂模式算是自己接触到的最早的一个设计模式了,大二的时候在网易公开课上学习Java基础。从那时起到现在工作快2个月了,也在各大框架上接触工厂模式,在看《Head First设计模式》的时候,越来越觉得这本书不适合我了,不说题外话开始整理吧。
简单工厂模式(Simple Factory Pattern)
简单工厂模式又称为静态工方法模式,这算是我觉得目前最好理解的一种设计模式了。简单工厂方法并不在我们熟知的23种设计模式之中,根据网络上的说法,这更像一种编程习惯。
定义:
你只需传入一个正确的参数,就能按照你的意愿创建出一个对象。例如:我想要一个NewDuck对象,那我只要传入一个"NewDuck"字符串即可。
Duck和实现类略
public class DuckFactory {
/**
* 创建鸭子
*
* @param className 想创建的类名
* @return 想创建类
*/
public Duck createDuck(String className) {
//利用向上转型技术完成,我是这样理解的
Duck duck;
if ("NewDuck".equals(className)) {
//创建NewDuck类
duck = new NewDuck();
} else {
//创建GaGa类
duck = new GaGa();
}
return duck;
}
}
根据上面的代码,我简单画一下UML的类图(刚开始用VS画的有点丑,别介意)
通过FactoryDuck可以创建出Duck的子类——NewDuck和GaGa,通过箭头也可以看出,DuckFactory和子类的关系是依赖关系,当我们需要增加新的子类的时候,就需要对工厂类进行修改,当子类数量达到一定程度的时候,逻辑判断和维护就会出现一定困难了。当所需要创建的子类类型少的时候,就可以使用简单工厂模式了。
工厂方法模式(Factory Method Pattern)
工厂方法模式又称为工厂模式或多态工厂模式,它属于创建型模式。在工厂模式中父类负责定义创建产品对象的公共集合,而子类工厂负责创建具体的产品。
举一个例子:现在要创建Shap这个超类,而三角形、圆形等类实现这个类。
public interface Shap {
public void display();
}
public class Triangle implements Shap {
@Override
public void display() {
System.out.println("I'm a triangle");
}
}
按照上面字面的意思创建一个父类工厂ShapFactory
public interface ShapFactory {
Shap getFactory();
}
创建具体子类的工厂TriangleFactory
public class TriangleFactory implements ShapFactory {
@Override
public Shap getFactory() {
return new Triangle();
}
}
测试代码
public class Main {
public static void main(String[] args) {
ShapFactory factory = new TriangleFactory();
Shap triangle = factory.getFactory();
triangle.display();
}
}
已经输出了Triangle类的display方法了
结构图
概括
当需要增加新的产品时,工厂方法模式只需新增子类和子类工厂,父类中方法不需要变更,解决了简单工厂的开闭原则。
抽象工厂模式(Abstract Factory Pattern)
关于这个设计模式,我建议大家去这里看,这里讲得很清楚——传送门
简单工厂和工厂方法都是创建一个类,但是抽象工厂能创建多个产品。