java设计模式系列之工厂模式

工厂模式属于建造者模式,在软件工程中广泛使用,接下来我将用java 来实现该工厂模式以及该模式的多种表现形式并分析各个表现形式的优劣
这个博客是用来自己学习并希望能帮助到大家,所以采用的代码基本都是参考
http://blog.csdn.net/zxt0601/article/details/52798423的代码,请知悉

工厂模式的建立会有几个步骤
1.建立一个抽象类(如 INoodles) 面条基类
2.多个具象类 继承该抽象类 (如 LZNoodles(兰州拉面),PaoNoodles(泡面),BanNoodles(拌面))
3.需要实现就是 new 一个 类的某个方法 并传入特定参数 就能获取 该具象类的实例
就如同 INoodles noodles = new NoodlesFactory.createNoodles(1);这样就能获取LZNoodles 类
所以 按照这个方式前进吧!
所有工厂模式各种表现形式都有个前提。也就是1,2这2步
这2步建立过程如下:

Noodles 抽象类:

package INoodles;
public abstract class INoodles {
    public abstract void desc();
}

各个实例化Noodles的类(如LZNoodles)

package Noodles;
import INoodles.INoodles;
public class LZNoodles extends INoodles{
    @Override
    public void desc() {
        System.out.println("lanzhou noodles");
    }
}

如PaoNoodles

package Noodles;
import INoodles.INoodles;
public class PaoNoodles extends INoodles{
    @Override
    public void desc () {
        System.out.println("pao noodles");
    }
}

这2步为工厂模式必须要有的,一个就是申明Noodles基类,其他都为继承该类的具体的类

1.单方法的简单工厂实现
我们可以先写出主函数

package Noodles;
import INoodles.INoodles;
import INoodles.INoodlesFactory;
import INoodles.LZNoodlesFactory;
import INoodles.NoodlesFactory;
import INoodles.PaoNoodlesFactory;
public class ChooseNoodles {
    public static void main(String[] args) {
        System.out.println("单方法静态工厂");
        INoodles myINoodles =NoodlesFactory.createNoodles(3);
        myINoodles.desc();
    }
}

可以看到 咱们需要编写NoodlesFactory 面条工厂类,里面有个静态方法 createNoodles ,还需要传入参数,参数定义还需要跟工厂类保持一致
NoodlesFactory如下:

package INoodles;
import Noodles.BanNoodles;
import Noodles.LZNoodles;
import Noodles.PaoNoodles;
public class NoodlesFactory {
private static final int LZ = 1;
private static final int PAO = 2;
private static final int BAN = 3;
//单方法的静态工厂实现
public static INoodles createNoodles(int type) {
    switch (type) {
        case LZ:
            return new LZNoodles();
        case PAO:
            return new PaoNoodles();
        case BAN:
            return new BanNoodles();
        default:
        break;
    }
    return null;
}

这时候就能够通过参数的不同,来获得不同具体的面条类了,在例子中可以看出些细节部分

工厂模式工厂类 主要的作用就是--根据参数的不同产生特定的实例对象,所以new Noodles的工作一定是在工厂在执行的。里面有个静态方法createNoodles ,大多数都是用静态方法来生产对象,所以工厂模式也称为静态工厂模式

在这个单方法的简单工厂模式中,我们可以看出以下一些特点以及缺点

特点
1 它是一个具体的类,非接口 抽象类。有一个重要的create()方法,利用if或者 switch创建产品并返回。
缺点
1 扩展性差(我想增加一种面条,除了新增一个面条产品类,还需要修改工厂类方法)
2 不同的产品需要不同额外参数的时候 不支持。

2.多方法的简单工厂实现
该方法是为了解决 单方法的简单工厂模式的第二个缺点 不同的产品需要不同额外参数的时候 不支持
所以我们的主函数可以这样表现:
INoodles myINoodles = NoodlesFactory.createLZNoodles();
这样就确保 工厂是生产LZNoodles这个方法,当然这个方法是可以传特定的参数的,这样就解决了第二个问题
这时候工厂类就应该改成这样:

//多方法的静态工厂实现
public static INoodles createLZ() {
    return new LZNoodles();
}
public static INoodles createPao() {
    return new PaoNoodles();
}
public static INoodles createBan() {
    return new BanNoodles();
}

主函数调用如下:

     System.out.println("多方法静态工厂--常用");
     INoodles myNoodles = NoodlesFactory.createLZ();
     myNoodles.desc();
     INoodles myNoodles2 = NoodlesFactory.createPao();
     myNoodles2.desc();

这样创建的工厂类 展现形式十分的通俗易懂,并易于拓展,大家常使用该工厂模式

3.普通工厂模式
普通工厂就是把简单工厂中具体的工厂类,划分成两层:抽象工厂层+具体的工厂子类层。(一般->特殊)
其实主要就是这样的流程,简单工厂使 工厂类生产各个实例类
普通工厂 为 让各个工厂继承该工厂类 如 生产LZNoodlesFactory,PaoNoodlesFactory等,然后在各个实例工厂类中再进行各个Noodles的实例了
代码如下:

LZNoodlesFactory.java

package INoodles;
import Noodles.LZNoodles;
public class LZNoodlesFactory extends INoodlesFactory{
    @Override
    public INoodles create() {
        return new LZNoodles();
    }
}

PaoNoodlesFactory.java

package INoodles;
import Noodles.PaoNoodles;
public class PaoNoodlesFactory extends INoodlesFactory{
    @Override
    public INoodles create() {
        return new PaoNoodles();
    }
}

这样在主函数就可以这样定义

System.out.println("普通工厂");
INoodles myIINoodles = new LZNoodlesFactory().create();
myIINoodles.desc();
INoodles myIINoodles2 = new PaoNoodlesFactory().create();
myIINoodles2.desc();

普通工厂与简单工厂模式的区别:

普通工厂的工厂也抽象,当需求增加使,只要增加该具体的工厂类,不需要修改原来的文件,保证一定的程序健壮性
缺点:
引入抽象工厂层后,每次新增一个具体产品类,也要同时新增一个具体工厂类。类的数量上升

4.抽象工厂模式:
该模式其实主要是普通工厂的集合 多个工厂由一个总的factory来定义。像是一个工厂家族的概念。代码就不公布了。

代码在这里:
https://github.com/taweisuode/test/tree/master/src

大家可以互相star 我的联系方式是1064480036@qq.com

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值