一.结构图
二.角色
从上图不难看出,简单工厂模式涉及到工厂角色,抽象产品角色,以及具体的产品角色:
工厂类(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;
}
@Override
public void createProducts() {
System.out.println("种植"+fruitName);
}
@Override
public void purchaseMaterials() {
System.out.println("购买用于种植"+fruitName+"的种子.");
}
@Override
public 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;
}
@Override
public void createProducts() {
// 生产产品:手机
System.out.println("生产["+mobileLogo+"]牌子的手机!");
}
@Override
public void purchaseMaterials() {
// 购买生产手机的原材料
System.out.println("购买生产["+mobileLogo+"]牌子的手机原材料");
}
@Override
public void salesProducts() {
// TODO Auto-generated method stub
System.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;
}
@Override
public void createProducts() {
System.out.println("生产"+planeType+"飞机");
}
@Override
public void purchaseMaterials() {
System.out.println("购买用于生产"+planeType+"飞机的发动机.");
}
@Override
public 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);
}
}