`

设计模式(三)--工厂模式(工厂方法模式+抽象工厂模式)

阅读更多

工厂模式:具体的可以分为两种,分别是工厂方法模式 、抽象工厂模式。

 

工厂方法模式:定义了一个创建对象的接口,但是由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到了子类。

设计原则:依赖倒置原则(要依赖抽象,而不是依赖具体类)。

遵守依赖倒置原则的几个建议:

1.变量不可以持有具体类的引用(如果使用new,就会持有具体类的引用,可以改用工厂来避开这样的做法)

2.不要让类派生自具体类(如果派生自具体类,你就会依赖具体类,请派生自一个抽象【接口或者抽象类】)

3.不要覆盖基类中已实现的方法(如果覆盖基类已实现的方法,那么你的基类就不是一个真正适合被继承的抽象。基类中已实现的方法,应该由所有的子类共享)

 

 

比较好的解释: http://blog.csdn.net/wyxhd2008/article/details/5597975

 

具体的工厂方法模式代码:

 

/**
 * Created by Administrator on 2017/12/9.
 * 产品类
 */
public abstract class Pizza {
    protected String name;
    protected String dough;

    protected  void prepare(){
        System.out.println("prepare");
    }

    protected  void cut(){
        System.out.println("cut");
    }

    protected  void box(){
        System.out.println("box");
    }

}

 

/**
 * Created by Administrator on 2017/12/9.
 * 创建类
 */
public abstract class PizzaStore {

    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type); //让子类自己去实现
        pizza.prepare();
        pizza.cut();
        pizza.box();
        return pizza;
    }

    /**
     * 让子类去根据情况实现创建Pizza
     * */
    protected abstract Pizza createPizza(String type);
}

 

 

/**
 * Created by Administrator on 2017/12/9.
 * 具体的实现的pizza
 */
public class CheesetPizza extends Pizza {

    public CheesetPizza() {
        this.name = "chesse";
        this.dough = "doughchesse";
    }

    @Override
    public String toString() {
        return "CheesetPizza " + this.name + ", " + this.dough;
    }
}

 

 

/**
 * Created by Administrator on 2017/12/9.
 * 具体的pizzaStore
 */
public class NYStylePizzaStore  extends PizzaStore {
    @Override
    protected Pizza createPizza(String type) {
        Pizza pizza = null;
        if("Cheese".equals(type)){  //根据不同类型创造不同的pizza
            pizza = new CheesetPizza();
        }/*else if("clam".equals(type)){
            //其他类型的Pizza
        }*/

        return pizza;
    }
}

 

 

/**
 * Created by Administrator on 2017/12/9.
 */
public class TestFactoryMethod {
    public static void main(String[] args) {
        PizzaStore pizzaStore = new NYStylePizzaStore();
        Pizza pizza = pizzaStore.orderPizza("Cheese");
        System.out.println(pizza);
    }
}

 

 

 

 

 

抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

 

/**
 * Created by Administrator on 2017/12/9.
 */
public abstract  class Pizza {

    protected Dough dough;

    protected abstract void prepare();

    protected  void cut(){
        System.out.println("cut");
    }

    protected  void box(){
        System.out.println("box");
    }
}

 

public abstract class PizzaStore {

    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type); //让子类自己去实现
        pizza.prepare();
        pizza.cut();
        pizza.box();
        return pizza;
    }

    /**
     * 让子类去根据情况实现创建Pizza
     * */
    protected abstract Pizza createPizza(String type);
}

 

 

/**
 * Created by Administrator on 2017/12/9.
 * pizza原料工厂
 */
public interface PizzaIngredientFactory {
    Dough createDough();
}

 

/**
 * Created by Administrator on 2017/12/9.
 * pizza的原料[可以变成接口,产生多个品种的Dough]
 */
public class Dough {
    private String dough;

    public String getDough() {
        return dough;
    }

    public void setDough(String dough) {
        this.dough = dough;
    }
}

 

/**
 * Created by Administrator on 2017/12/9.
 */
public class CheesePizaa  extends  Pizza{

    private PizzaIngredientFactory pizzaIngredientFactory ;

    public CheesePizaa(PizzaIngredientFactory pizzaIngredientFactory) {
        this.pizzaIngredientFactory = pizzaIngredientFactory;
    }

    @Override
    protected void prepare() {
        this.dough = pizzaIngredientFactory.createDough();//通过工厂来产生原料
    }
}

 

/**
 * Created by Administrator on 2017/12/9.
 */
public class NYPizzaStore extends PizzaStore {
    @Override
    protected Pizza createPizza(String type) {
        Pizza pizza = null;
        PizzaIngredientFactory pizzaIngredientFactory = new NYPizzaIngredientFactory();
        if("Cheese".equals(type)){
            pizza = new CheesePizaa(pizzaIngredientFactory);
        }/*else if("clam".equals(type)){

        }*/
        return pizza;
    }
}

 

/**
 * Created by Administrator on 2017/12/9.
 */
public class NYPizzaIngredientFactory implements PizzaIngredientFactory{
    @Override
    public Dough createDough() {
        return new Dough();
    }
}

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics