版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ljk126wy/article/details/85249599
1 简单工厂缺点 以及方法工厂实现逻辑
通过我的上一篇博客 工厂模式之简单工厂 我们了解了什么是简单工厂。我们可以通过创建钢工厂类对象来获取不同类型的钢对象。但是如果我们每次新增加一种类型的钢,我们需要对钢工厂类的getSteel 方法进行修改。这显然是违反了设计模式的开放闭合原则。而我们的方法工厂刚好弥补了简单工厂的这个缺点。
那我们方法工厂是怎么做的呢? 首先我们先提供工厂的抽象,也就是工厂生产的标准。然后将原来的一个工厂根据钢的种类拆分成各自的工厂,同时实现工厂的抽象,也可以理解成符合工厂的生产标准。获取钢对象由原来的一个工厂中获取 变成通过不同种类的工厂来获取。
2 方法工厂代码实现
1 定义工厂的抽象 也是定义工厂的生产规范
getSteel 方法就是生产钢的规范。
package cn.zhuoqianmingyue.examples.factorypattern.method;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;
public interface Factory {
public Steel getSteel();
}
2 为每种类型的钢创建各自的工厂类。
生产铸钢的工厂类
package cn.zhuoqianmingyue.examples.factorypattern.method;
import cn.zhuoqianmingyue.examples.factorypattern.simple.CastSteel;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;
public class CastSteelFactory implements Factory{
@Override
public Steel getSteel() {
return new CastSteel();
}
}
生产冷拉钢 的工厂类
package cn.zhuoqianmingyue.examples.factorypattern.method;
import cn.zhuoqianmingyue.examples.factorypattern.simple.ColdDrawnSteel;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;
public class ColdDrawnSteelFactory implements Factory {
@Override
public Steel getSteel() {
return new ColdDrawnSteel();
}
}
生产锻钢的工厂类
package cn.zhuoqianmingyue.examples.factorypattern.method;
import cn.zhuoqianmingyue.examples.factorypattern.simple.ForgedSteel;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;
public class ForgedSteelFactory implements Factory{
@Override
public Steel getSteel() {
return new ForgedSteel();
}
}
生产热轧钢的工厂类
package cn.zhuoqianmingyue.examples.factorypattern.method;
import cn.zhuoqianmingyue.examples.factorypattern.simple.HotRolledSteel;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;
public class HotRolledSteelFactory implements Factory{
@Override
public Steel getSteel() {
return new HotRolledSteel();
}
}
方法工厂模式的测试类
package cn.zhuoqianmingyue.examples.factorypattern.method;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;
public class ApplicationTest {
public static void main(String[] args) {
//生产铸钢
Factory castSteelFactory = new CastSteelFactory();
Steel castSteel = castSteelFactory.getSteel();
log(castSteel.getName());
//生产冷拉钢
Factory coldDrawnSteelFactory = new ColdDrawnSteelFactory();
Steel coldDrawnSteel = coldDrawnSteelFactory.getSteel();
log(coldDrawnSteel.getName());
}
private static void log(String name) {
System.out.println("生产"+name+"成功!");
}
}
测试结果: