从简单案例了解设计模式--工厂模式

从简单案例了解设计模式–工厂模式

在工厂模式的学习中我们使用面条的一个简单案例,通过传统new对象的方式和工厂模式进行比对,加深对工厂模式的了解。

传统模式开发

定义吃面条的接口

public interface INoodles {
    /**
     * 描述每种面条啥样的
     */
    public abstract void desc();
}

各种实现类

public class LzNoodles implements INoodles {
    @Override
    public void desc() {
        System.out.println("兰州拉面,兰州特色小吃");
    }
}

public class PaoNoodles implements INoodles {
    @Override
    public void desc() {
        System.out.println("泡面,程序员必备");
    }
}

public class ReganNoodles implements INoodles {
    @Override
    public void desc() {
        System.out.println("红油热干面,武汉特色小吃");
    }
}

使用

		// 做拉面吃
        INoodles lzNoodles = new LzNoodles();
        // 做泡面吃
         INoodles paoNoodles = new PaoNoodles();
        // 做热干面吃
         INoodles reganNoodles = new ReganNoodles();

        // 然而,new来new去,改来改去,好心烦......

分析: 每次都要去new对象,来生成各种面条类的实例对象,这里的理解就相当于自己做面条想吃什么面条这里就new哪种面条。

工厂模式开发

就吃面条的案例而言,如果说new对象的方式相当于自己做面条的话,那么工厂模式就相当于去面馆吃面条,只要告诉面馆你要那种面条就能得到想要的面条。

创建简单的面馆工厂SimpleNoodlesFactory

如果生产对象的方法是static的,这种简单工厂也叫做静态工厂
如果生产对象的方法不是static的,这种简单工厂也叫做实例工厂

/**
 * 简单工厂模式
 * 一家“简单面馆”(简单工厂类)
 */
public class SimpleNoodlesFactory {

    public static final int TYPE_LZ = 1;//兰州拉面
    public static final int TYPE_PM = 2;//泡面
    public static final int TYPE_GK = 3;//热干面

    /**
     * 
     * @param type
     * @return
     */
    public static INoodles createNoodles(int type) {
        switch (type) {
            case 1:
                return new LzNoodles();
            case 2:
                return new PaoNoodles();
            case 3:
                return new ReganNoodles();
            default:
                return new LzNoodles();
        }
    }
}

测试

INoodles iNoodles = SimpleNoodlesFactory.createNoodles(2);  // 和具体的对象脱离关系
        iNoodles.desc();

由以上得出结论

使用工厂模式的场景

  • 当用户程序不需要知道要使用对象的创建过程
  • 客户程序使用的对象存在变动的可能,或者根本就不知道使用具体哪一个对象

工厂方法模式

当面馆扩张之后,每个种类的面条都由一个专属的面馆来制作,这里我们就设计到了工厂的接口和方法。

定义工厂接口

/**
 * 工厂方法模式
 */
public interface INoodlesFactory {
     INoodles createNoodles();
}

常见接口实现类

public class LzINoodlesFactory implements INoodlesFactory {
    @Override
    public INoodles createNoodles() {
        return new LzNoodles();
    }
}
public class PaoINoodlesFactory implements INoodlesFactory {
    @Override
    public INoodles createNoodles() {
        return new PaoNoodles();
    }
}
public class ReganINoodlesFactory implements INoodlesFactory {
    @Override
    public INoodles createNoodles() {
        return new ReganNoodles();
    }
}

测试

public static void main(String[] args) {
     INoodlesFactory noodlesFactory = new LzINoodlesFactory();
     INoodles noodles = noodlesFactory.createNoodles();
     noodles.desc();
 }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值