设计模式 工厂模式 从卖肉夹馍说起

今天继续设计模式之旅,给大家带来工厂模式,简单列一下这个模式的家族:

1、静态工厂模式

2、简单工厂模式

3、工厂方法模式

4、抽象工厂模式

是不是觉得,我勒个去,这工厂还能列出这么多分类,哈哈,下面开始各个击破。

1、静态工厂模式

这个最常见了,项目中的辅助类,TextUtil.isEmpty等,类+静态方法。下面开始详细介绍:略。

2、简单工厂模式

下面开始谈谈卖肉夹馍,最近程序员卖肉夹馍很火,啥时候大牛们都去卖了,我等就崛起了,哈哈。

首先你得有个店:RoujiaMoStore

package com.zhy.pattern.factory.a;

public class RoujiaMoStore
{

    /**
     * 根据传入类型卖不同的肉夹馍
     *
     * @param type
     * @return
     */
    public RouJiaMo sellRouJiaMo(String type)
    {
        RouJiaMo rouJiaMo = null;

        if (type.equals("Suan"))
        {
            rouJiaMo = new SuanRouJiaMo();

        } else if (type.equals("Tian"))
        {
            rouJiaMo = new TianRouJiaMo();
        } else if (type.equals("La"))
        {
            rouJiaMo = new LaRouJiaMo();
        }

        rouJiaMo.prepare();
        rouJiaMo.fire();
        rouJiaMo.pack();
        return rouJiaMo;
    }

}

然后你得有各种风味的馍馍:

package com.zhy.pattern.factory.a;

public abstract class RouJiaMo
{
    protected String name;

    /**
     * 准备工作
     */
    public void prepare()
    {
        System.out.println("揉面-剁肉-完成准备工作");
    }

    /**
     * 使用你们的专用袋-包装
     */
    public void pack()
    {
        System.out.println("肉夹馍-专用袋-包装");
    }
    /**
     * 秘制设备-烘烤2分钟
     */
    public void fire()
    {
        System.out.println("肉夹馍-专用设备-烘烤");
    }
}
package com.zhy.pattern.factory.a;

import com.zhy.pattern.factory.a.RouJiaMo;

/**
 * 辣味肉夹馍
 *
 * @author zhy
 *
 */
public class LaRouJiaMo extends RouJiaMo
{
    public LaRouJiaMo()
    {
        this.name = "辣味肉夹馍";
    }
}
package com.zhy.pattern.factory.a;

/**
 * 酸味肉夹馍
 *
 * @author zhy
 *
 */
public class SuanRouJiaMo extends RouJiaMo
{
    public SuanRouJiaMo()
    {
        this.name = "酸味肉夹馍";
    }
}

现在这样的设计,虽然可以支持你卖肉夹馍了,但是有点问题,生产馍的种类和你的RoujiaMoStore耦合度太高了,如果增加几种风味,删除几种风味,你得一直修改sellRouJiaMo中的方法,所以我们需要做一定的修改,此时简单工厂模式就能派上用场了。

我们开始写个简单工厂,把产生馍的过程拿出来:

package com.zhy.pattern.factory.a;

public class SimpleRouJiaMoFactroy
{
    public RouJiaMo createRouJiaMo(String type)
    {
        RouJiaMo rouJiaMo = null;
        if (type.equals("Suan"))
        {
            rouJiaMo = new SuanRouJiaMo();

        } else if (type.equals("Tian"))
        {
            rouJiaMo = new TianRouJiaMo();
        } else if (type.equals("La"))
        {
            rouJiaMo = new LaRouJiaMo();
        }
        return rouJiaMo;
    }

}

然后以组合的方式,让Store来使用:

package com.zhy.pattern.factory.a;

public class RoujiaMoStore
{
    private SimpleRouJiaMoFactroy factroy;

    public RoujiaMoStore(SimpleRouJiaMoFactroy factroy)
    {
        this.factroy = factroy;
    }

    /**
     * 根据传入类型卖不同的肉夹馍
     *
     * @param type
     * @return
     */
    public RouJiaMo sellRouJiaMo(String type)
    {
        RouJiaMo rouJiaMo = factroy.createRouJiaMo(type);
        rouJiaMo.prepare();
        rouJiaMo.fire();
        rouJiaMo.pack();
        return rouJiaMo;
    }

}

然后以组合的方式,让Store来使用:

package com.zhy.pattern.factory.a;

public class RoujiaMoStore
{
    private SimpleRouJiaMoFactroy factroy;

    public RoujiaMoStore(SimpleRouJiaMoFactroy factroy)
    {
        this.factroy = factroy;
    }

    /**
     * 根据传入类型卖不同的肉夹馍
     *
     * @param type
     * @return
     */
    public RouJiaMo sellRouJiaMo(String type)
    {
        RouJiaMo rouJiaMo = factroy.createRouJiaMo(type);
        rouJiaMo.prepare();
        rouJiaMo.fire();
        rouJiaMo.pack();
        return rouJiaMo;
    }

}

好了,现在你随便添加什么种类的馍,删除什么种类的馍就和Store无关了,就是么~人家只负责卖馍么~ 这就是简单工厂模式,当然了,大家也都比较熟悉。

3、工厂方法模式

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

好了,看完定义,下面我们用例子来展示。继续肉夹馍,由于使用了简单工厂模式,肉夹馍生意那个好啊,所以下载决定去西安开个分店,去北京开个分店。既然有分店了,那总店就是抽象的了:

package com.zhy.pattern.factory.b;

public abstract class RoujiaMoStore
{

    public abstract RouJiaMo createRouJiaMo(String type);

    /**
     * 根据传入类型卖不同的肉夹馍
     *
     * @param type
     * @return
     */
    public RouJiaMo sellRouJiaMo(String type)
    {
        RouJiaMo rouJiaMo = createRouJiaMo(type);
        rouJiaMo.prepare();
        rouJiaMo.fire();
        rouJiaMo.pack();
        return rouJiaMo;
    }

}

然后在开两个分店,这里拿一个代码做演示,其他都一样:

package com.zhy.pattern.factory.b;

/**
 * 西安肉夹馍店
 *
 * @author zhy
 *
 */
public class XianRouJiaMoStore extends RoujiaMoStore
{

    @Override
    public RouJiaMo createRouJiaMo(String type)
    {
        RouJiaMo rouJiaMo = null;
        if (type.equals("Suan"))
        {
            rouJiaMo = new XianSuanRouJiaMo();

        } else if (type.equals("Tian"))
        {
            rouJiaMo = new XianTianRouJiaMo();
        } else if (type.equals("La"))
        {
            rouJiaMo = new XianLaRouJiaMo();
        }
        return rouJiaMo;

    }

}

然后就是各个西安口味的肉夹馍了,这代码就不贴了。可以看出我们把制作肉夹馍的过程以抽象方法的形式让子类去决定了,对照定义:

1、定义了创建对象的一个接口:public abstract RouJiaMo createRouJiaMo(String type);

2、由子类决定实例化的类,可以看到我们的馍是子类生成的。

可能有人会说,我用简单工厂模式也行啊,但是如果10来个城市*5种风味/城市,那么岂不是简单工厂里面需要50多个if,再说人家西安肉夹馍分店就不能有点自己的秘诀,当然由它自己定最好。

好了,方法工厂模式介绍完毕。

4、抽象工厂模式

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

这定义有点绕口,算了,还是拿例子来说。继续卖肉夹馍,咱们生意这么好,难免有些分店开始动歪脑子,开始使用劣质肉等,砸我们的品牌。所以我们要拿钱在每个城市建立自己的原料场,保证高质量原料的供应。

于是我们新建一个提供原料的接口:

package com.zhy.pattern.factory.b;

/**
 * 提供肉夹馍的原料
 * @author zhy
 *
 */
public interface RouJiaMoYLFactroy
{
    /**
     * 生产肉
     * @return
     */
    public Meat createMeat();

    /**
     * 生产调料神马的
     * @return
     */
    public YuanLiao createYuanliao();

}
package com.zhy.pattern.factory.b;

/**
 * 根据西安当地特色,提供这两种材料
 * @author zhy
 *
 */
public class XianRouJiaMoYLFactroy implements RouJiaMoYLFactroy
{

    @Override
    public Meat createMeat()
    {
        return new FreshMest();
    }

    @Override
    public YuanLiao createYuanliao()
    {
        return new XianTeSeYuanliao();
    }

}

有了原理工厂,那我们稍微修改下RouJiaMo的prepare方法:

package com.zhy.pattern.factory.b;

public abstract class RouJiaMo
{
    protected String name;

    /**
     * 准备工作
     */
    public final void prepare(RouJiaMoYLFactroy ylFactroy)
    {
        Meat meat = ylFactroy.createMeat();
        YuanLiao yuanliao = ylFactroy.createYuanliao();
        System.out.println("使用官方的原料" + meat + " , " + yuanliao + "作为原材料制作肉夹馍 ");
    }

    /**
     * 使用你们的专用袋-包装
     */
    public final void pack()
    {
        System.out.println("肉夹馍-专用袋-包装");
    }

    /**
     * 秘制设备-烘烤2分钟
     */
    public final void fire()
    {
        System.out.println("肉夹馍-专用设备-烘烤");
    }
}

好了,现在必须用我们官方原料做为原材料了。

现在对比定义:

1、提供一个接口:public interface RouJiaMoYLFactroy

2、用于创建相关的或依赖对象的家族 public Meat createMeat();public YuanLiao createYuanliao();我们接口用于创建一系列的原材料。

好了,最后测试下,我要在西安馍店,买个酸味的尝尝:

package com.zhy.pattern.factory.b;

public class Test
{
    public static void main(String[] args)
    {

        RoujiaMoStore roujiaMoStore = new XianRouJiaMoStore();
        RouJiaMo suanRoujiaMo = roujiaMoStore.sellRouJiaMo("Suan");
        System.out.println(suanRoujiaMo.name);
    }
}
使用官方的原料[email protected] , [email protected]作为原材料制作肉夹馍
肉夹馍-专用设备-烘烤
肉夹馍-专用袋-包装
酸味肉夹馍

哈哈~肉夹馍店的已经建立起来了,兄弟们卖馍去把~记得留个言,给个赞~

时间: 2024-10-22 22:46:36

设计模式 工厂模式 从卖肉夹馍说起的相关文章

6.大话设计模式-工厂模式

工厂模式和简单工厂有什么区别.废话不多说,对比第一篇例子应该很清楚能看出来. 优点: 工厂模式弥补了简单工厂模式中违背开放-封闭原则,又保持了封装对象创建过程的优点. using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace DesignModel{    public interface Factory   

设计模式---工厂模式---生产水果

设计模式---工厂模式 需要一个基本的抽象类:相当一个基本的工厂 需要若干个具体类:相当若干个产品 需要工具类:相当工厂中机器,用来选择不同的产品生产 需要主类:相当顾客所想的订单 主类 ----> 工厂类 ----> 产品类 ---> 产品具体类 老板根据顾客的订单,在工具堆中选择合适的,然后去工厂中生产适合的产品,返回给顾客 优势:能够在不修改原先的代码情况,增加所需的类与方法. 不足:会增多类文件的数量 接口:提供的内容,相当于协议,即外界使用此接口时,接口的内容是不允许外界对接口

设计模式——工厂模式学习

1.概念 工厂模式定义:实例化对象,用工厂方法代替new操作.达到解耦的目的(避免硬编码耦合).工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式. 工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例

二十三种设计模式——工厂模式

二十三种设计模式--工厂模式 简单工厂模式 简单工厂模式又称静态工厂方法(StaticFactory Method)模式,不属于23种模式之一. 简单工厂模式是工厂模式最简单使用的模式. 类图: 程序: #include <iostream> #include<string> using namespace std; class NationalFlag//父类 { public: NationalFlag(){} ~NationalFlag(){} virtual void di

设计模式-工厂模式[Factory]

先看下一个简单的实现: 1 package org.masque.designpatterns.factorymethod.one; 2 /** 3 * 4 * Description: Sample子类的标示 5 * BeanEm.java Create on 2014年7月11日 下午2:37:58 6 * @author [email protected] 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Res

5分钟读书笔记之 - 设计模式 - 工厂模式

一个类或者对象中,往往会包含别的对象.在创建这种对象的时候,你可能习惯于使用常规方式,即用 new 关键字和类构造函数. 这会导致相关的俩个类之间产生依赖. 工厂模式,就是消除这俩个类之间的依赖性的一种模式,它使用一种方法来决定究竟实例化那个具体的类. 简单工厂模式 假设你想开几个自行车商店,每个商店都有几种型号的自行车出售,可以用这样一个类来表示: var BicycleShop = function(){} BicycleShop.prototype = { sellBicycle:func

设计模式——工厂模式

常说的工厂模式一般认为有三种:简单工厂.工厂方法模式.抽象工厂模式.其中简单工厂严格上来说不是一种设计模式,而被认为是一种好的编码习惯/风格. 简单工厂 简单工厂的本质就是封装变化的代码,使客户代码将要面临的改变变少.而且被封装的代码也有了更好的复用性,比如服务多个客户端或者被继承/包装等工具来扩展. 下面以肾5和肾6为对象来说明 //define product(iphone) interface public interface IPhone{ public void model(); }

java设计模式--工厂模式

总结 (1)简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的. (2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成. (3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类.它针对的是有多个产品的等级结构.而工厂方法模式针对的是一个产品的等级结构. 一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java

23种设计模式--工厂模式-Factory Pattern

一.工厂模式的介绍       工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例就就依赖与这个类,2者之间的耦合度就高,此时我们就可以使用面向对象的去解决这个问题,将变化点封装起来,这就是我们将要首先引入的简单工厂模式:先来说一个场景,比如我们吃水果这个例子吧,我们有时候想吃苹果,有时候想吃橘子,但是每次都需要去买这些水果,后来有个水果店,又卖橘子,又卖苹果,这个水果店就当于简