Head First设计模式之工厂模式

工厂模式包括三种:简单工厂模式、工厂方法模式和抽象工厂模式。

严格意义上讲,简单工厂模式不能算作设计模式,充其量只是封装,遵守了比较好的设计原则。本文主要探索工厂方法模式和抽象工厂模式。
工厂方法模式

定义一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。
比如,现在要通过ChinesePizza店订购培根Pizza。这里将PizzaStore写成抽象类,ChinesePizzaStore或者之后的AmericanPizzaStore都将继承该类,且该类中的createPizza方法写成抽象方法,即Pizza口味由实例化的子类决定。
代码如下:

public abstract class PizzaStore {
    Pizza pizza;

    public Pizza orderPizza(String type) {
        pizza = createPizza(type);
        return pizza;

    }

    protected abstract Pizza createPizza(String type);

}

ChinesePizzaStore.java:

public class ChinesePizzaStore extends PizzaStore {

    @Override
    protected Pizza createPizza(String type) {
        if (type.equals("Cheese")){
            return new CheesePizza();
        }else if (type.equals("Bacon")){
            return new BaconPizza();
        }else {
            return null;
        }
    }
}

Pizza.java:

public abstract class Pizza {
     String name;

    public String getName(){
        return name;
    }
}

BaconPizza.java:

public class BaconPizza extends Pizza {
    public BaconPizza(){
        name = "Bacon";
    }
}

这样,通过createPizza这个工厂方法,将具体Pizza的实现放到工厂如ChinesePizzaStore中实现,写一个Main方法做测试:

public class Main {
    public static void main(String[] args){
        ChinesePizzaStore chinesePizzaStore = new ChinesePizzaStore();
        Pizza pizza = chinesePizzaStore.orderPizza("Bacon");
        System.out.println("Pizza name is:" + pizza.getName());

    }
}

输出:

Pizza name is:Bacon

Process finished with exit code 0

一个很简单的小例子,直接从书上copy过来的,如果以后有更多的具体PizzaStore的话,只需要继承抽象PizzaStore即可,不用修改太多代码。工厂方法主要就是采用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象。遵循的设计原则:依赖倒置。即避免依赖具体类型,尽量以来抽象。

抽象工厂模式:

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
还以Pizza为例,现在不同区域的Pizza原料不同了,PizzaStore应该直接从不同区域拿原料。
结构如下:
这里写图片描述
与工厂方法相比,主要区别在于,新建了一个接口PizzaIngredientFactory,不同区域的原料工厂实现此接口。

public interface PizzaIngredientFactory {
    Dough createDough();

    Cheese createCheese();
}

在这些具体工厂中实现工厂方法:

public class ChinesePizzaIngredientFactory implements PizzaIngredientFactory {
    @Override
    public Dough createDough() {
        return new ThickDough();
    }

    @Override
    public Cheese createCheese() {
        return new WhiteCheese();
    }
}

而创建具体Pizza时,只需要将对应的工厂参数传递进去。

public class CheesePizza extends Pizza {
    PizzaIngredientFactory pizzaIngredientFactory;
    Dough dough;
    Cheese cheese;
    public CheesePizza(PizzaIngredientFactory pizzaIngredientFactory){
        this.pizzaIngredientFactory = pizzaIngredientFactory;
        name = "cheese";
    }
    @Override
    void prepare() {
        dough = pizzaIngredientFactory.createDough();
        cheese = pizzaIngredientFactory.createCheese();
    }
}
public class ChinesePizzaIngredientFactory implements PizzaIngredientFactory {
    @Override
    public Dough createDough() {
        return new ThickDough();
    }

    @Override
    public Cheese createCheese() {
        return new WhiteCheese();
    }
}

太懒了,直接上图。
工厂方法

抽象工厂

PS. Android中的工厂模式应该挺多,经常接触的,BitmapFactory绝对是一个,而且是简单工厂模式,主要封装一些decode**()方法,其它的有待研究。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值