您的位置:首页 > 编程语言 > Java开发

Java设计模式——工厂方法设计模式

2018-02-05 15:58 204 查看

概述

之前简单介绍了简单工厂设计模式,需要的童靴可以点击这里查看详情。

本文主要介绍的是工厂方法设计模式。那么,工厂方法设计模式跟简单工厂设计模式有什么不同的呢。先看一下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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: