Effective Java(静态工厂与构造器二)

从静态工厂说起,接前一篇的私有构造器,在网上查到的静态工厂方法并没有限制构造器的私有化,只是通过工厂方法来管理父类的子类。

简单工厂模式(又叫静态工厂模式)

主要由父类(抽象产品),子类(具体产品),工厂(创建对象)组成

以一个食物订购为例

父类:

/*
 * 产品抽象类
 */
public interface Food {

	//获得相应的食物
	public void get();
}


子类:

/*
 * 麦香鸡对抽象产品接口的实现
 */
public class McChicken implements Food{

	//获取一份麦香鸡
	@Override
	public void get() {
		// TODO Auto-generated method stub
		System.out.println("我要一份麦香鸡");
	}

}


/*
 * 薯条对抽象产品的接口实现
 */
public class Chips implements Food {

	//获取一份薯条
	@Override
	public void get() {
		// TODO Auto-generated method stub
		System.out.println("我想要一份薯条");
	}

}

工厂:

public class FoodFactory {

	public static Food getFood(String type){
		if(type.equals("McChicken")){
			return new McChicken();
		}else if(type.equals("Chips")){
			return new Chips();
		}
		return null;
	}
}

测试类:

public class FoodFactoryTest {

	private static Food mcChicken;
	private static Food chips;
	
	public static void main(String[] args) {
		mcChicken=FoodFactory.getFood("McChicken");
		chips=FoodFactory.getFood("Chips");
		if(mcChicken!=null){
			mcChicken.get();
		}
		if(chips!=null){
			chips.get();
		}
	}
}

这里有一点要注意的是,多态的使用:前面工厂new的实例是子类,但返回的是父类,测试类用父类接收,然后调用方法。(当然了,测试类中的接收类也可以是子类,使用向下转型便可,结果一样)


这种方法看起来是很好的,但是对于每次新增一种子类,都要在工厂中去改写,违背了开闭原则,首先想到的是使用再写一个factory,那么就是使工厂抽象化,UML如下图所示


进一步,很多工厂就会区分工厂的种类,便有了抽象工厂


上面两种方法代码示例见http://www.cnblogs.com/zhangchenliang/p/3700820.html


参考:

http://blog.163.com/zhuowh2006@126/blog/static/10182372420133220511247/

http://blog.youkuaiyun.com/superbeck/article/details/4446177

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值