1.工厂模式(Factory Method)

一:准备工作

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 使个类的实例化延迟到其子类。

适用性:

当一个类不知道它所必须创建的对象的类的时候。

当一个类希望由它的子类来指定它所创建的对象的时候。

当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值