Java设计模式--简单工厂模式与抽象工厂模式

简单工厂模式
以女娲造人为例。下面是类图。
这里写图片描述
步骤:
1、先定义接口人

2、不同的人种实现人这个接口,并实现接口中的方法

3、定义一个生产人的工厂: Human createHuman(Class c)
传入要生产的人种对应的类,即可进行生产相应的人种。
human =(Human)Class.forName(c.getName()).newInstance(); //产生一个人种

4、在主类调用工厂类中的方法即可。Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
该对象whiteHuman便可以调用接口中的方法了。

工厂方法模式还有一个非常重要的应用,就是延迟始化(Lazy initialization),即一个对象初始化完毕后就不释放,等到再次用到得就不用再次初始化了,直接从内存过中拿到就可以了。实现方法:通过集合Map来进行存储。

if(humans.containsKey(c.getSimpleName()))
{
    human = humans.get(c.getSimpleName());
}
else
{
    human = (Human)Class.forName(c.getName()).newInstance();
    // 放到 MAP 中
    humans.put(c.getSimpleName(), human);
}

抽象工厂模式
上面的例子利用工厂类种的方法可以产生不同的人种。但是如果要求人种有性别的话,那么生产的方式也应当做相应的调整。先看下Human的类图


从类图中可以看出一个接口、几个抽象类、几个实现类。其中三个抽象类在抽象工厂模式中是叫做产品等级,六个实现类是叫做产品族。

下面看一下抽象工厂的类图:

这里写图片描述

抽象工厂只实现了一个 createHuman 的方法。使用枚举参数(可以用枚举将各种各样的人种定义出来,可以有不同的性别等属性),让两个生产的工厂继承抽象工厂,并实现其方法createHuman (相应的枚举变量),即可以生产出所需要的各种各样的人种。如下为生产男性人种的工厂

public class MaleHumanFactory extends AbstractHumanFactory {
    //创建一个男性黑种人
    public Human createBlackHuman() {
    return super.createHuman(HumanEnum.BlackMaleHuman);
    }
    //创建一个男性白种人
    public Human createWhiteHuman() {
    return super.createHuman(HumanEnum.WhiteMaleHuman);
    }
    //创建一个男性黄种人
    public Human createYellowHuman() {
    return super.createHuman(HumanEnum.YelloMaleHuman);
    }
}

在主类进行生产:使用特定的生产线生产特定的人种。

//第一条生产线,男性生产线
HumanFactory maleHumanFactory = new MaleHumanFactory();
//第二条生产线,女性生产线
HumanFactory femaleHumanFactory = new FemaleHumanFactory();
//生产线建立完毕,开始生产人了:
Human maleYellowHuman = maleHumanFactory.createYellowHuman();
Human femaleYellowHuman = femaleHumanFactory.createYellowHuman();
maleYellowHuman.cry();
maleYellowHuman.laugh();
femaleYellowHuman.sex();

总结:
(1)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。

(2)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。

(3)工厂模式符合 OCP 原则,也就是开闭原则,比如就性别的问题,这个世界上还存在双性人,是男也是女的人,那这个就是要在我们的产品族中增加一类产品,同时再增加一个工厂就可以解决这个问题。

(4)好处:高内聚,低耦合,在一个较大的项目组,产品是由一批人定义开发的,但是提供其他成员访问的时候,只有工厂方法和产品的接口,也就是说只需要提供 Product Interface 和 Concrete Factory 就可以产生自己需要的对象和方法。方便产品的迭代更新。

发布了46 篇原创文章 · 获赞 3 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章