工厂模式

本文通过康师傅泡面的例子介绍了几种常见的设计模式:工厂模式、静态工厂方法模式及抽象工厂模式,并展示了每种模式的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

——-三人行 必有我师

说到设计的模式,当来离不开我们的工厂了是不是,来,让我们看看康师傅的泡面工厂.做泡面,有很多种类是不是,我们这简单点,就说两种吧,酸菜和牛肉的.做泡面有很多流程,其中和面,油炸,还有最重要的调料包是少不了的,所以我们把这三样做成个接口,做泡面都要实现它

public interface Paomian {

    void hemian();           //和面
    void youzha();           //油炸
    void tiaoliaopao();      //调料包
}

然后我们该开始决定具体怎么做泡面了,老坛酸菜这样做

public class LtscPaomian implements Paomian{  //老坛酸菜

    public void hemian() {
        // TODO Auto-generated method stub
    }

    public void youzha() {
        // TODO Auto-generated method stub
    }

    public void tiaoliaopao() {
        // TODO Auto-generated method stub
        System.out.println("没胃口,吃吃酸菜");
    }   

}

牛肉味的这样做

public class NrwPaomian implements Paomian{  //牛肉味

    public void hemian() {
        // TODO Auto-generated method stub

    }

    public void youzha() {
        // TODO Auto-generated method stub

    }

    public void tiaoliaopao() {
        // TODO Auto-generated method stub
        System.out.println("一种感觉不像肉的东西");
    }

}

好了,规定好了怎么做,我们就要开始做了.但是我们肯定不是单独做啊,这销量我们要有个工厂是不是

public class KsfFactory {   //康师傅工厂

    public Paomian getPaomian(String type){

        if("LtscPaomian".equals(type)){
            return new LtscPaomian();

        }else if("NrwPaomian".equals(type)){

            return new NrwPaomian();

        }else{

            throw new IllegalArgumentException("参数错误");
        }
    }
}

这叫普通工厂,你要什么类型泡面,我就给你什么泡面,来看看测试

public static void main(String[] args) {
        // TODO Auto-generated method stub

        (new KsfFactory()).getPaomian("LtscPaomian").tiaoliaopao();
        (new KsfFactory()).getPaomian("NrwPaomian").tiaoliaopao();
    }

输出

没胃口,吃吃酸菜
一种感觉不像肉的东西

但是像这样子的 普通工厂 我们有时候会填错参数的,所以 多方法工厂 就出现了

public class KsfFactory {   //康师傅工厂

    public Paomian productLtsc(){  //制作老坛酸菜泡面
        return new LtscPaomian();
    }

    public Paomian productNrw(){
        return new LtscPaomian();
    }
}

这样子还是有点不好是不是,因为我们要个泡面我们还要去new个工厂,所以我们也不会这么写.所以我们平常用的更多是静态工厂方法模式

public class KsfFactory {   //康师傅工厂

    public static Paomian productLtsc(){  //制作老坛酸菜泡面
        return new LtscPaomian();
    }

    public static Paomian productNrw(){
        return new LtscPaomian();
    }
}

这个样子就是我们常用的状态了.最后说下抽象工厂模式,我们这样的屁民去买泡面,现在就差不多就两个选择吧,统一和康师傅,当然还有一些存在,基本都是这两家了.它们都有做泡面,但肯定做的不一样是吧.材料之类的等肯定做不到一样的.所以这时候抽象工厂模式就出场了,我们定义一个做泡面的抽象工厂

public abstract class MakePaomianFactory {

    public abstract Paomian getLtscPaomian();
    public abstract Paomian getNrwPaomian();
}

康师傅工厂

public class KsfFactory extends MakePaomianFactory{   //康师傅工厂

    public Paomian getLtscPaomian() {
        // TODO Auto-generated method stub
        return new KsfLtsc();
    }

    public Paomian getNrwPaomian() {
        // TODO Auto-generated method stub
        return KsfNrw();
    }
}

统一工厂

public class TyFactory extends MakePaomianFactory{   //统一工厂


    public Paomian getLtscPaomian() {
        // TODO Auto-generated method stub
        return TyLtsc();
    }

    public Paomian getNrwPaomian() {
        // TODO Auto-generated method stub
        return TyNrw();
    }
}

这个时候,吃那个牌子就由你自己来决定了是不是. 这样子虽然不是静态方法,但是我们可以把我们的工厂做成单例也差不多效果是吧.

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值