工厂方法设计模式 factory method
与静态工厂设计模式不同的一点是,将工厂抽象出来,形成接口,去除工厂的静态方法属性。
这样工厂就可以扩展了,遵循了开闭原则,当工厂为简单工厂的时候,工厂产出什么是根据工厂的逻辑判断的,如果新加PHP程序员PHPCoder 就要改变工厂的方法,这样是不好的。
所以将工厂抽象出来,Factory
建立生产不同码农的具体工厂 IOSCoderFactory JAVACodeFactory
建立抽象Coder 和多个实现子类 JAVACoder IOSCoder
类图:
代码:
package factoryMethod;
/**
* 将简单工厂设计模式中的工厂抽象 命为接口
* @author coffee
*
*/
public interface CoderFactory {
/**
*
* @return Coder
*/
public Coder buildCoder();
}
package factoryMethod;
public class IOSCoderFactory implements CoderFactory {
@Override
public Coder buildCoder() {
return new IOScoder();
}
}
package factoryMethod;
public class JAVACoderFactory implements CoderFactory {
<span style="white-space:pre"> </span>//培训javaCoder的工厂机构
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public Coder buildCoder() {
<span style="white-space:pre"> </span>return new JavaCoder();
<span style="white-space:pre"> </span>}
}
package factoryMethod;
/**
* 程序员的接口
* @author coffee
*
*/
public interface Coder {
//程序员敲代码的抽象方法
public void Code();
}
package factoryMethod;
/**
* IOS开发程序员
* @author coffee
*
*/
public class IOScoder implements Coder {
//具体的实现方法
@Override
public void Code() {
System.out.println("写代码,开发IOS项目");
}
}
package factoryMethod;
/**
* java程序员
* @author coffee
*
*/
public class JavaCoder implements Coder {
//具体的实现方法
@Override
public void Code() {
System.out.println("写代码,开发Java项目");
}
}
package factoryMethod;
/**
* 工厂方法设计模式 是简单工厂(静态工厂的进一步抽象和推广)
* 缺点:产品增加 工厂的个数会增加
*
* 工厂方法 只针对一种系列的产品进行生成 如 java ios php 程序员
* 如果工厂想扩展 就违背了开闭原则
* Factory只能是培训输出程序员的 如果 工厂要培训输出产品设计师就不行 一个产品族就可以分为 设计师 程序员 项目管理 等等
* 而且 程序员分为高级程序员 中级程序员 低级程序员 设计师分高级设计师 中级设计师 低级设计师 。。。产品等级划分
* 所以引进抽象工厂 面对多产品等级结构设计的
* @author coffee
*
*/
public class Test {
public static void main(String[] args) {
CoderFactory IOScoderFactory = new IOSCoderFactory();
Coder IOScoder = IOScoderFactory.buildCoder();
IOScoder.Code();
CoderFactory javacoderFactory = new JAVACoderFactory();
Coder JAVAcoder = javacoderFactory.buildCoder();
JAVAcoder.Code();
}
}