一、工厂方法模式说明
简单工厂模式是一个工厂生产多种产品,该模式不符合设计原则中的开闭原则。
而工厂方法则是简单工厂的进一步变形,参照上一篇《(一)简单工厂模式》中的场景说明图:
1、消费者向工厂采购产品(水果)
2、工厂指定生成线(方法)生成产品
3、工厂将产品提供给消费者。
模式要素:
1、产品接口类、产品接口实现类。
2、工厂提供具体产品生产方法。
3、具体产品生产方法返回产品接口类。
二、代码示例
1、产品(水果)接口类:
package com.mycompany.app;
/**
* 水果接口类
*/
public interface Fruit {
/**
* 获取水果名称
* @return 名称
*/
String getName();
}
2、产品(苹果)实现类:
package com.mycompany.app;
public class Apple implements Fruit {
public String getName() {
return "苹果";
}
}
3、产品(香蕉)实现类:
package com.mycompany.app;
public class Banana implements Fruit {
public String getName() {
return "香蕉";
}
}
4、产品(橘子)实现类
package com.mycompany.app;
public class Orange implements Fruit {
public String getName() {
return "橘子";
}
}
5、工厂接口类:
package com.mycompany.app;
public class FunctionFactoryTest {
public static void main(String[] args) {
//提供工厂实例
FunctionFactory factory = new AppleFactory();
Fruit apple = factory.getFruit();
System.out.println("购买苹果:" + apple.getName());
factory = new BananaFactory();
Fruit banana = factory.getFruit();
System.out.println("购买香蕉:" + banana.getName());
factory = new OrangeFactory();
Fruit orange = factory.getFruit();
System.out.println("购买香蕉:" + orange.getName());
}
}
6、苹果工厂类:
package com.mycompany.app;
public class AppleFactory implements FunctionFactory{
public Fruit getFruit() {
return new Apple();
}
}
7、香蕉工厂类:
package com.mycompany.app;
public class BananaFactory implements FunctionFactory {
public Fruit getFruit() {
return new Banana();
}
}
8、橘子工厂类:
package com.mycompany.app;
public class OrangeFactory implements FunctionFactory {
public Fruit getFruit() {
return new Orange();
}
}
9、测试类:
package com.mycompany.app;
public class FunctionFactoryTest {
public static void main(String[] args) {
//提供工厂实例
FunctionFactory factory = new AppleFactory();
Fruit apple = factory.getFruit();
System.out.println("购买苹果:" + apple.getName());
factory = new BananaFactory();
Fruit banana = factory.getFruit();
System.out.println("购买香蕉:" + banana.getName());
factory = new OrangeFactory();
Fruit orange = factory.getFruit();
System.out.println("购买香蕉:" + orange.getName());
}
}
10、测试结果:
购买苹果:苹果
购买香蕉:香蕉
购买香蕉:橘子
Process finished with exit code 0