一、工厂方法模式概述
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
工厂方法模式的结构
工厂接口:工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。
工厂实现:在编程中,工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的工厂实现。
产品接口:产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用抽象类来代替,但要注意最好不要违反里氏替换原则。
产品实现:实现产品接口的具体类,决定了产品在客户端中的具体行为。
二、工厂方法模式代码示例
先定义产品接口
public interface Shoe {
public void getName();
}
再定义两个产品实现
public class NikeShoe implements Shoe {
@Override
public void getName() {
System.out.println("------Nike--------");
}
}
public class AdShoe implements Shoe {
@Override
public void getName() {
System.out.println("------Ad--------");
}
}
定义工厂接口
public interface ShoeFactory {
public Shoe getShoe();
}
再定义两个对应产品的工厂实现类
public class NikeFactory implements ShoeFactory {
@Override
public Shoe getShoe() {
return new NikeShoe();
}
}
public class AdFactory implements ShoeFactory {
@Override
public Shoe getShoe() {
return new AdShoe();
}
}
客户端
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
ShoeFactory factory = new NikeFactory();
Shoe nikeShoe = factory.getShoe();
nikeShoe.getName();
factory = new AdFactory();
Shoe adShoe = factory.getShoe();
adShoe.getName();
}
}
输出结果
------Nike--------
------Ad--------