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

来源:互联网 发布:大数据先进技术研究院 编辑:程序博客网 时间:2024/05/17 02:38

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

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

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

以一个食物订购为例

父类:

/* * 产品抽象类 */public interface Food {//获得相应的食物public void get();}


子类:

/* * 麦香鸡对抽象产品接口的实现 */public class McChicken implements Food{//获取一份麦香鸡@Overridepublic void get() {// TODO Auto-generated method stubSystem.out.println("我要一份麦香鸡");}}


/* * 薯条对抽象产品的接口实现 */public class Chips implements Food {//获取一份薯条@Overridepublic void get() {// TODO Auto-generated method stubSystem.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.csdn.net/superbeck/article/details/4446177

0 0
原创粉丝点击