工厂方法模式是一种常用的创建型设计模式。它解决了简单工厂模式的问题:如违反了开闭原则,其次可以用于更复杂的结构
它的核心结构有四个角色 抽象工厂;具体工厂;抽象产品;具体产品
抽象工厂(抽象类或接口)不在负责具体的创建过程,即具体的代码实现。只制定了规范,具体的实现将由具体的工厂去实现。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式(Factory Method pattern)是最典型的模板方法模式的应用
代码示例如下:
定义一个抽象工厂类:
/*** 蛋糕工厂类* 定义蛋糕工厂类 该类主要是定义了createCake抽象方法,并且在无参构造函数中进行调用,具体的实现是在子类里进行实例化的*/
public abstract class CakeFactory {abstract Cake createCake();public CakeFactory() {createCake();}
}
定义具体的工厂类:
/*** @desc: 苹果蛋糕工厂类类*/
public class AppleCakeFactory extends CakeFactory{@Overridepublic Cake createCake() {return new AppleCake();}
}
/*** @desc: 香蕉蛋糕工厂类*/
public class BananaCakeFactory extends CakeFactory{@Overridepublic Cake createCake() {return new BananaCake();}
}
定义抽象产品类:
/*** 蛋糕父类*/
public abstract class Cake {
}
定义具体的产品类:
/*** 苹果蛋糕*/
public class AppleCake extends Cake {public AppleCake(){System.out.println("创建了苹果蛋糕实例");}
}
/*** 香蕉蛋糕*/
public class BananaCake extends Cake {public BananaCake(){System.out.println("创建了香蕉蛋糕实例");}
}
测试类
/*** 测试类*/
public class Test {public static void main(String[] args) {AppleCakeFactory appleCakeFactory = new AppleCakeFactory();BananaCakeFactory bananaCakeFactory = new BananaCakeFactory();}
}
工厂方法经常用在以下两种情况中:
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。java Collection中的iterator() 方法即属于这种情况。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,这个决策过程对生产者来说是透明的。