码迷,mamicode.com
首页 > 其他好文 > 详细

抽象工厂模式

时间:2016-07-19 15:35:27      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:

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

技术分享

Pizza(抽象产品接口)

public interface Pizza {
    
    public void prepare();
    
    public void bake();
    
    public void cut();
    
    public void box();

}

 

CheesePizza(实际产品)

public class CheesePizza implements Pizza {

    @Override
    public void prepare() {
        System.out.println("prepare cheese pizza");

    }

    @Override
    public void bake() {
        System.out.println("bake cheese pizza");

    }

    @Override
    public void cut() {
        System.out.println("cut cheese pizza");

    }

    @Override
    public void box() {
        System.out.println("pack cheese pizza");

    }

}

ClamPizza(实际产品)

public class ClamPizza implements Pizza {

    @Override
    public void prepare() {
        System.out.println("prepare calm pizza");

    }

    @Override
    public void bake() {
        System.out.println("bake calm pizza");

    }

    @Override
    public void cut() {
        System.out.println("cut calm pizza");

    }

    @Override
    public void box() {
        System.out.println("pack calm pizza");

    }

}

MushroomPizza(实际产品)

public class MushroomPizza implements Pizza {

    @Override
    public void prepare() {
        System.out.println("prepare mushroom pizza");

    }

    @Override
    public void bake() {
        System.out.println("bake mushroom pizza");

    }

    @Override
    public void cut() {
        System.out.println("cut mushroom pizza");

    }

    @Override
    public void box() {
        System.out.println("pack mushroom pizza");

    }

}

PizzaFactory(抽象工厂接口)

public interface PizzaFactory {
    
    public Pizza createPizza();

}

CheesePizzaCreator(对象的实际创建者)

public class CheesePizzaCreator implements PizzaFactory {
    @Override
    public Pizza createPizza() {
        return new CheesePizza();
    }
}

ClamPizzaCreator(对象的实际创建者)

public class ClamPizzaCreator implements PizzaFactory {
    @Override
    public Pizza createPizza() {
        return new ClamPizza();
    }
}

MushroomPizzaCreator(对象的实际创建者)

public class MushroomPizzaCreator implements PizzaFactory {
    @Override
    public Pizza createPizza() {
        return new MushroomPizza();
    }
}

测试类

public class MyTest {
    
    @Test
    public void test() {
//        PizzaFactory factory = new ClamPizzaCreator();
//        PizzaFactory factory = new CheesePizzaCreator();
        PizzaFactory factory = new MushroomPizzaCreator();
        Pizza pizza = factory.createPizza();
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
    }
}

由实际代码可以看出,抽象工厂模式把对象的创建推迟到了子类之中,这样达到了解耦的目的,在测试类中,客户并不需要知道CheesePizza和MushroomPizza在准备原料,烘焙,包装时的一些差异,客户只需要知道,我需要一个蘑菇风味的披萨,于是我要MushroomPizzaCreator这个子工厂去给我生成一个蘑菇披萨就好了,如果下次我们打算加入一个新的披萨例如HamPizza,原有的代码不需要做任何改变,我们只要添加一个实际的产品,HamPizza和实际的子工厂,HamPizzaCreator就可以了;如果我们不打算销售Clam风味的披萨(味道会不会很怪?),只需要删除ClamPizza产品和其对应的子工厂就好了,客户只要根据菜单来点菜就好了,抽象工厂模式有几个优点符合OO设计原则:

1. 将不变和可变部分分离开来,对可变部分进行封装。

2. 将对象的实例化推迟到子类来达到解耦的目的。

3. 面向接口编程而非面向实现编程

抽象工厂模式

标签:

原文地址:http://www.cnblogs.com/stonefeng/p/5682935.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!