工厂模式

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
1. 简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
**3. 抽象工厂模式(Abstract Factory) **

简单工厂模式

工厂模式_第1张图片
简单工厂模式
public static Operation createOperate(string operate)
{
    Operation oper = null;
    switch (operate)
    {
        case "+":
            {
            oper = new OperationAdd();
            break;
            }
        case "-":
            {
            oper = new OperationSub();
            break;
            }
        case "*":
            {
            oper = new OperationMul();
            break;
            }
        case "/":
            {
            oper = new OperationDiv();
            break;
            }
    }
    return oper;
}

父类为基础运算类Operation (也可为接口或抽象类),子类为具体运算类。createOperator("/")返回除法运算类,方法中通过父类引用指向子类实例来实现。

工厂模式_第2张图片
UML

工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意, 这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。

工厂模式_第3张图片
实例
/*
 * 产品的抽象接口
 */
public interface Food {
    /*
     * 获得相应的食物
     */
    public void get();
}

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

/*
 * 薯条对抽象产品接口的实现
 */
  public class Chips implements Food{
    /*
     * 获取一份薯条
     */
    public void get(){
        System.out.println("我要一份薯条");
    }
}

public class FoodFactory {
 
    public static Food getFood(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        if(type.equalsIgnoreCase("mcchicken")) {
            return McChicken.class.newInstance();
 
        } else if(type.equalsIgnoreCase("chips")) {
            return Chips.class.newInstance();
        } else {
            System.out.println("哎呀!找不到相应的实例化类啦!");
            return null;
        }
 
 
    }
}

/*
 * 测试客户端
 */
public class SimpleFactoryTest {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
 
        //实例化各种食物
        Food mcChicken = FoodFactory.getFood("McChicken");
        Food chips = FoodFactory.getFood("Chips");
        Food eggs = FoodFactory.getFood("Eggs");
 
        //获取食物
        if(mcChicken!=null){
            mcChicken.get();
        }
        if(chips!=null){
            chips.get();
        }
        if(eggs!=null){
            eggs.get();
        }
    }
}

优点:客户端不需要修改代码。  
缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。

工厂方法模式

这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂


工厂模式_第4张图片
工厂方法模式

这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂

好处:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。

缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。


参考文章:
http://blog.csdn.net/weiwenlongll/article/details/6918164/
http://blog.chinaunix.net/uid-25958655-id-4243289.html

你可能感兴趣的:(工厂模式)