设计模式之(工厂模式)3种

设计模式之(工厂模式)3种


今天学习一下最常见也是最常用的一种设计模式,就是工厂模式。


工厂模式一般分为3种:

简单工厂模式

工厂方法模式

抽象工厂模式


简单工厂模式

简单工厂模式其实不是一种设计模式,反而比较像一种编程习惯。由于经常被使用,有些开发人员把这个误认为是“工厂模式”...

如下以Pizza为例

Pizza 种类很多,创建一个Pizza(抽象类)基类。

/**
 * Created by view_man on 2016/12/1.
 */
public abstract class Pizza {

    public abstract void prepare();

    public abstract void create();

    public abstract void finish();
}

CheesePizza,Pizza的一种

/**
 * Created by view_man on 2016/12/1.
 */
public class CheesePizza extends Pizza {

    @Override
    public void prepare() {
        System.out.println("CheesePizza prepare");
    }

    @Override
    public void create() {
        System.out.println("CheesePizza create");
    }

    @Override
    public void finish() {
        System.out.println("CheesePizza finish");
    }
}

PepperoniPizza,Pizza的一种

/**
 * Created by view_man on 2016/12/1.
 */
public class PepperoniPizza extends Pizza {

    @Override
    public void prepare() {
        System.out.println("PepperoniPizza prepare");
    }

    @Override
    public void create() {
        System.out.println("PepperoniPizza create");
    }

    @Override
    public void finish() {
        System.out.println("PepperoniPizza finish");
    }
}

Pizza工厂

/**
 * Created by view_man on 2016/12/1.
 */
public class PizzaFactory {
    public static final String CHEESEPIZZA = "CheesePizza";
    public static final String PEPPERONIPIZZA = "PepperoniPizza";

    public Pizza createPizza(String type){
        Pizza pizza = null;
        if (type.equals(CHEESEPIZZA)){
            pizza = new CheesePizza();
        }else if (type.equals(PEPPERONIPIZZA)){
            pizza = new PepperoniPizza();
        }
        return pizza;
    }
}

Pizza商店

/**
 * Created by view_man on 2016/12/1.
 */
public class PizzaStore {

    private PizzaFactory pizzaFactory;

    public PizzaStore(PizzaFactory pizzaFactory) {
        this.pizzaFactory = pizzaFactory;
    }

    public void orderPizza(String type) {
        Pizza pizza = null;
        pizza = pizzaFactory.createPizza(type);
        if (pizza != null) {
            pizza.prepare();
            pizza.create();
            pizza.finish();
        } else {
            System.out.println("No this type");
        }
    }
}

测试:

public class Main {

    public static void main(String[] args){
        PizzaStore pizzaStore = new PizzaStore(new PizzaFactory());
        pizzaStore.orderPizza(PizzaFactory.CHEESEPIZZA);
        pizzaStore.orderPizza(PizzaFactory.PEPPERONIPIZZA);
    }
}

结果:

简单工厂模式比较简单,相信看代码都能明白,这里就不详细讲解。


工厂方法模式

定义:

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

如下:

观察画红圈的地方,再和之前的对比,你就不难看出简单工厂和工厂方法的区别了。

createPizza(String type)

此方法就如同一个工厂,将实例化的责任转移到一个方法中。

具体怎么做由子类去决定。注意红圈的地方。


测试:

结果:

注意红圈的地方,大家好好对比着看,相信很快就能理解。


抽象工厂模式

抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要关心实际产出的产品类型具体是什么,这样,客户就从具体的产品中解耦出来。

定义:

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


说到抽象工厂模式,其实它就是把工厂抽象出去,如下:


对于客户(这里指BJCheesePizza)而言,不需要关心实际产出的产品类型具体是什么,注意红圈的位置。

在实际生产中,我们通过传不同的工厂即可生产不同的Pizza,对于客户(这里指Pizza的实例,需要大家细细体会)而言,无论传哪种工厂,它接收的始终是PizzaFactoryInterface,所以不需要关心实际产出的产品类型具体是什么。


测试:

结果:


总结:

1、所有的工厂都是封装对象的创建。

2、简单工厂,虽然不是真正的设计模式,但仍不失为一个简单方法,将客户程序从具体类解耦。

3、工厂方法通过继承,把对象的创建委托给子类,子类实现工厂方法创建对象。

4、抽象工厂使用对象组合,对象的创建被实现在工厂接口所暴露出来的方法中。

5、依赖导致原则,避免依赖具体类型,要尽量依赖抽象。




微信:feifie254

QQ:645139778

csdn:http://blog.csdn.net/qq645139778 或者(搜索 view-man)

GitHub:https://github.com/view-man

知乎:view-man


关注公众号:孙益飞


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值