简单工厂模式(Simple Factory)
一.结构图

?
二.角色
??? 从上图不难看出,简单工厂模式涉及到工厂角色,抽象产品角色,以及具体的产品角色:
??? 工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑.工厂类在客户端的直接调用下创建产品对象,它通常由一个具体的JAVA类实现.
??? 抽象产品(Product)角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或它们共同拥有的接口,抽象产品角色可以用一个java接口或java抽象类实现.
??? 具体产品(Concrete Product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体的java类实现.
?
三,简单示例:
? Creator.java
public class Creator{ /** * 静态工厂方法 */ public static Product factory(){ return new ConcreteProduct(); }}?
Product.java
public interface Product{}?
ConcreteProduct.java
public class ConcreteProduct implements Product{ public ConcreteProduct(){ }}?
?
?
一个较完整的例子:

?
?
/********************************************** * @author Simon Hoo (simon@cottsoft.com) * @contact QQ:9930323 MSN: simon_hoo@msn.com * @OnlineSupport: http://www.CottSoft.com * @Create 2011-1-16 * @version V1.0 ********************************************/package com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory;import com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory.exception.AppException;public class Main {/** * @param args */public static void main(String[] args) {try{Factory.factory("m").purchaseMaterials();Factory.factory("m").createProducts();Factory.factory("m").salesProducts();System.out.println("******************");Factory.factory("p").purchaseMaterials();Factory.factory("p").createProducts();Factory.factory("p").salesProducts();System.out.println("******************");Factory.factory("f").purchaseMaterials();Factory.factory("f").createProducts();Factory.factory("f").salesProducts();System.out.println("******************");}catch(AppException ae){ae.printStackTrace();}}}?
?
/********************************************** * @author Simon Hoo (simon@cottsoft.com) * @contact QQ:9930323 MSN: simon_hoo@msn.com * @OnlineSupport: http://www.CottSoft.com * @Create 2011-1-16 * @version V1.0 ********************************************/package com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory;public interface ISimpleFactory {public void purchaseMaterials();public void createProducts();public void salesProducts();}?
?
/********************************************** * @author Simon Hoo (simon@cottsoft.com) * @contact QQ:9930323 MSN: simon_hoo@msn.com * @OnlineSupport: http://www.CottSoft.com * @Create 2011-1-16 * @version V1.0 ********************************************/package com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory;import com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory.exception.AppException;import com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory.impl.FruitFactories;import com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory.impl.MobileFactories;import com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory.impl.PlaneFactories;public class Factory {/** * 静态工厂方法 * @param which * @return * @throws AppException */public static ISimpleFactory factory(String which) throws AppException{if(which.equalsIgnoreCase("m")){return new MobileFactories("Nokia");}else if (which.equalsIgnoreCase("p")){return new PlaneFactories("A380");}else if(which.equalsIgnoreCase("f")){return new FruitFactories("苹果");}else {throw new AppException("找不到你所生产产品的工厂.");}}}?
?
/********************************************** * @author Simon Hoo (simon@cottsoft.com) * @contact QQ:9930323 MSN: simon_hoo@msn.com * @OnlineSupport: http://www.CottSoft.com * @Create 2011-1-16 * @version V1.0 ********************************************/package com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory.impl;import com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory.ISimpleFactory;public class FruitFactories implements ISimpleFactory {private String fruitName;public FruitFactories(String fruitName){this.fruitName = fruitName;}@Overridepublic void createProducts() {System.out.println("种植"+fruitName);}@Overridepublic void purchaseMaterials() {System.out.println("购买用于种植"+fruitName+"的种子.");}@Overridepublic void salesProducts() {System.out.println("销售"+fruitName);}public String getFruitName() {return fruitName;}public void setFruitName(String fruitName) {this.fruitName = fruitName;}}?
?
/********************************************** * @author Simon Hoo (simon@cottsoft.com) * @contact QQ:9930323 MSN: simon_hoo@msn.com * @OnlineSupport: http://www.CottSoft.com * @Create 2011-1-16 * @version V1.0 ********************************************/package com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory.impl;import com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory.ISimpleFactory;public class MobileFactories implements ISimpleFactory {private String mobileLogo;public MobileFactories(String mobileLogo){this.mobileLogo=mobileLogo;}@Overridepublic void createProducts() {// 生产产品:手机System.out.println("生产["+mobileLogo+"]牌子的手机!");}@Overridepublic void purchaseMaterials() {// 购买生产手机的原材料System.out.println("购买生产["+mobileLogo+"]牌子的手机原材料");}@Overridepublic void salesProducts() {// TODO Auto-generated method stubSystem.out.println("销售["+mobileLogo+"]牌子的手机.");}public String getMobileLogo() {return mobileLogo;}public void setMobileLogo(String mobileLogo) {this.mobileLogo = mobileLogo;}}?
?
/********************************************** * @author Simon Hoo (simon@cottsoft.com) * @contact QQ:9930323 MSN: simon_hoo@msn.com * @OnlineSupport: http://www.CottSoft.com * @Create 2011-1-16 * @version V1.0 ********************************************/package com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory.impl;import com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory.ISimpleFactory;public class PlaneFactories implements ISimpleFactory {private String planeType;public PlaneFactories(String planeType){this.planeType=planeType;}@Overridepublic void createProducts() {System.out.println("生产"+planeType+"飞机");}@Overridepublic void purchaseMaterials() {System.out.println("购买用于生产"+planeType+"飞机的发动机.");}@Overridepublic void salesProducts() {System.out.println("销售"+planeType+"飞机");}public String getPlaneType() {return planeType;}public void setPlaneType(String planeType) {this.planeType = planeType;}}?
?
/********************************************** * @author Simon Hoo (simon@cottsoft.com) * @contact QQ:9930323 MSN: simon_hoo@msn.com * @OnlineSupport: http://www.CottSoft.com * @Create 2011-1-16 * @version V1.0 ********************************************/package com.cottsoft.design_pattern.p01_creational_pattern.p01_simple_factory.exception;public class AppException extends Exception {public AppException(String msg){super(msg);}}?