概述
之前简单介绍了简单工厂设计模式,需要的童靴可以点击这里查看详情。
本文主要介绍的是工厂方法设计模式。那么,工厂方法设计模式跟简单工厂设计模式有什么不同的呢。先看一下UML图
简单工厂的区别
简单工厂中,工厂类就一个具体的实现类,它封装了所有的必要逻辑。使用中,可以根据客户端选择的条件动态地实例化相关类。而在工厂方法设计模式中,创建了一个基类的抽象工厂,然后又创建了子类的工厂,这样可以让子类去决定实例化哪个工厂类。使得工厂类的实例化被延迟到了子类。这样就可以把简单工厂中的的具体的内部逻辑判断移送到了客户端,如果以后要加功能的话就不必兴师动众修改工厂类了,修改客户端就好了。这样子更符合开闭原则,工厂类和产品类的耦合性更小一些,修改的时候破坏性更小。
代码举例
跟简单工厂类一样,还是以鸟类进行举例,说明工厂方法类的基本实现。
/**
* Bird 接口(鸟类的基类 角色:Product)
*/
public interface Bird {
public void fly();
public void run();
}
下面是具体的产品角色类
/**
* 鸵鸟(不会飞,跑得快)
* 角色:ConcreteProduct
*/
public class Ostrich implements Bird {
@Override
public void fly() {
System.out.print("不会飞");
}
@Override
public void run() {
System.out.print("跑得快");
}
}
/**
* 鹦鹉(会飞,跑得慢)
* 角色:ConcreteProduct
*/
public class Parrot implements Bird {
@Override
public void fly() {
System.out.print("会飞");
}
@Override
public void run() {
System.out.print("跑得慢");
}
}
上面是产品类,跟简单工厂类是一样的,不需要多说。下面说一下工厂类
/**
* 角色:工厂基类
*/
public interface BaseBirdFactory {
Bird getBird();
}
/**
* 鸵鸟工厂
* 具体的工厂子类
*/
public class OstrichFactory implements BaseBirdFactory{
private static OstrichFactory ostrichFactory;
private OstrichFactory(){
}
public static OstrichFactory getInstance(){
if(ostrichFactory==null){
ostrichFactory = new OstrichFactory();
}
return ostrichFactory;
}
@Override
public Bird getBird() {
return new Ostrich();
}
}
/**
* 鹦鹉工厂
* 具体的工厂子类
*/
public class ParrotFactory implements BaseBirdFactory {
private static simplefactory.ParrotFactory parrotFactory;
private ParrotFactory() {
}
public static simplefactory.ParrotFactory getInstance() {
if (parrotFactory == null) {
parrotFactory = new ParrotFactory();
}
return parrotFactory;
}
@Override
public Bird getBird() {
return new Parrot();
}
}
客户端使用
public class Main {
public static void main(String[] args){
Bird ostrich = OstrichFactory.getInstance().getBird();
ostrich.fly();
ostrich.run();
Bird parrot = ParrotFactory.getInstance().getBird();
parrot.fly();
parrot.run();
}
}