一:准备工作
1.创建一个要生产对象的一个接口(这类定义一个水果Fruit接口),以及定义一个方法eat()。
package com.yh.createrpattern.factory;
/**
*
* @author YH
* @project DesignPattern
* @description 定义一个水果接口
* @vesion 1.0
* @date 2015年12月1日 下午12:25:50
*
*/
public interface Fruit {
/**
* 定义一个吃的方法
*/
public void eat();
}
2.创建两个具体的水果类(Banana,Pear)分别实现Fruit接口。
package com.yh.createrpattern.factory;
/**
*
* @author YH
* @project DesignPattern
* @description 水果接口的一个实现类
* @vesion 1.0
* @date 2015年12月1日 下午12:27:18
*
*/
public class Banana implements Fruit {
@Override
public void eat() {
System.out.println("Eatting banna!");
}
}
package com.yh.createrpattern.factory;
/**
*
* @author YH
* @project DesignPattern
* @description 定义一个水果接口实现的梨子类
* @vesion 1.0
* @date 2015年12月1日 下午12:29:27
*
*/
public class Pear implements Fruit {
@Override
public void eat() {
System.out.println("Eatting pear!");
}
}
1.普通工厂
package com.yh.createrpattern.factory;
/**
*
* @author YH
* @project DesignPattern
* @description 水果简单工厂
* 简单工厂的弊端:1.当输入的type字符串没有就会出问题,没有具体的类型
* @vesion 1.0
* @date 2015年12月1日 下午12:31:29
*
*/
public class BaseFruitFactory {
/**
* 选择水果
* @param type 水果类型
* @return 对应的水果对象
*/
public Fruit choice(String type){
if (type.equals("pear")) {
return new Pear();
}else if (type.equals("banana")) {
return new Banana();
}else {
System.out.println("没有此类水果");
return null;
}
}
}
2.多个方法工厂
package com.yh.createrpattern.factory;
/**
*
* @author YH
* @project DesignPattern
* @description 多个工厂模式:直接定义具体的方法
* 好处避免类简单工厂的类型字符串没有的问题
* @vesion 1.0
* @date 2015年12月1日 下午12:36:01
*
*/
public class ManyFruitFactory {
/**
* 选择梨子
* @return
*/
public Fruit choicePear(){
return new Pear();
}
/**
* 选择香蕉
* @return
*/
public Fruit choiceBanana(){
return new Banana();
}
}
3.静态方法工厂
package com.yh.createrpattern.factory;
/**
*
* @author YH
* @project DesignPattern
* @description 水果静态工厂(不用实例话,直接调用方法)
* @vesion 1.0
* @date 2015年12月1日 下午12:39:41
*
*/
public class StaticFruitFactory {
public static Fruit choicePear() {
return new Pear();
}
public static Fruit choiceBanner() {
return new Banana();
}
}
三、调用对应的工厂
package com.yh.createrpattern.factory;
public class MainFactory {
public static void main(String[] args) {
/**
* 工厂模式:(1.普通工厂模式_BaseFruitFactory,2.多个工厂方法模式_ManyFruitFactory,3.
* 静态工厂方法模式_StaticFruitFactory)
*/
baseFruitFactory();
manyFruitFactory();
staticFruitFactory();
}
/**
* 普通工厂
*/
public static void baseFruitFactory() {
BaseFruitFactory baseFruitFactory = new BaseFruitFactory();// 创建普通工厂对象
// 吃梨子
baseFruitFactory.choice("pear").eat();
// 吃香蕉
baseFruitFactory.choice("banana").eat();
// 其他
try {
baseFruitFactory.choice("other").eat();
} catch (NullPointerException e) {
System.out.println("选择类型不存在!");
// e.printStackTrace();
}
}
/**
* 多个工厂方法模式
*/
public static void manyFruitFactory() {
ManyFruitFactory manyFruitFactory = new ManyFruitFactory();// 创建多个工厂方法水果对象
// 吃梨子
manyFruitFactory.choicePear().eat();
// 吃香蕉
manyFruitFactory.choiceBanana().eat();
}
/**
* 静态工厂方法模式
*/
public static void staticFruitFactory() {
// 吃香蕉
StaticFruitFactory.choiceBanner().eat();
// 吃梨子
StaticFruitFactory.choicePear().eat();
}
}
总结:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
适用性:
当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。