(三)抽象工厂模式

一,抽象工厂的出现

由于简单工厂不能应对“不同系列对象”的变化。比如有不同风格的场景—对应不同
风格的道路,房屋、地道、、、、。

二、 抽象工厂的具体实现

例如:绝味鸭脖想在江西、南昌和上海开分店,但是由于当地人的口味不同,在南昌
的所有绝味的东西会做的比较辣一些,而上海不喜欢吃辣的,所以上海不会做成像南昌
那么的辣,这导致南昌绝味工厂和上海绝味工厂生产所有绝味产品不同,也就是某个
具体工厂负责一系列产品的口味不同。



/**
 * 下面以绝味鸭脖连锁店为例子,演示抽象工厂模式
 * 因为每个地方喜欢的口味不同,有些地方喜欢辣点的,有的地方不喜欢吃辣
 * <p>
 * 客户端调用.
 */
public class Client {
    public static void main(String[] args) {
        // 上海工厂制作上海的鸭脖和鸭架
        AbstractFactory shangHaiFactory = new ShangHaiFactory();
        shangHaiFactory.createYaBo().print();
        shangHaiFactory.createYaJia().print();

        //南昌工厂制作的鸭脖和鸭架
        AbstractFactory  nanChangFactory = new NanChangFactory();
        nanChangFactory.createYaBo().print();
        nanChangFactory.createYaJia().print();
    }
}


/**
 * 抽象工厂,提供不同地方鸭架和鸭脖的接口.
 */
public abstract class AbstractFactory {
    public abstract YaBo createYaBo();
    public abstract YaJia createYaJia();
}


/**
 *南昌绝味工厂制作南昌的鸭脖和鸭架.
 */
public class NanChangFactory extends AbstractFactory {
    @Override
    public YaBo createYaBo() {
        return new NanChangYaBo();
    }

    @Override
    public YaJia createYaJia() {
        return new NanChangYaJia();
    }
}

/**
 * 上海绝味工厂,负责制作上海的鸭脖和鸭架.
 */
public class ShangHaiFactory extends AbstractFactory{
    //制作上海鸭脖
    @Override
    public YaBo createYaBo() {
        return new ShangHaiYaBo();
    }
    //制作上海鸭架
    @Override
    public YaJia createYaJia() {
        return new ShangHaiYaJia();
    }
}

/**
 * 鸭脖抽象类,供每个地方实现类继承
 */
public abstract class YaBo {
    //打印鸭脖的输出信息
    protected abstract void print();
}



/**
 * 鸭架抽象类,供每个地方的鸭架类继承.
 */
public abstract class YaJia {
    //打印方法用于输出信息
    protected abstract void print();
}


/**
 * 南昌鸭脖,因为南昌喜欢吃辣,所以制作的鸭脖比上海制作的鸭脖辣.
 */
public class NanChangYaBo extends YaBo {
    @Override
    protected void print() {
        System.out.println("南昌的鸭脖");
    }
}


/**
 * 南昌鸭架.
 */
public class NanChangYaJia extends YaJia {
    @Override
    protected void print() {
        System.out.println("南昌鸭架");
    }
}

/**
 * 上海的鸭脖,没有南昌鸭脖做的辣.
 */
public class ShangHaiYaBo extends YaBo {
    @Override
    protected void print() {
        System.out.println("上海的鸭脖");
    }
}


/**
 * 上海的鸭架.
 */
public class ShangHaiYaJia extends YaJia {
    @Override
    protected void print() {
        System.out.println("上海的鸭架");
    }
}

三、抽象工厂模式的定义和类图

这里写图片描述

抽象工厂模式:提供一个创建产品的接口来负责创建相关或依赖的对象,而不具体明
确指定具体类

1,抽象工厂应对需求变更

看完上面抽象工厂的实现之后,如果 “绝味”公司又想在湖南开一家分店怎么办呢? 因为湖南人喜欢吃麻辣的,
下面就具体看看应用了抽象工厂模式的系统是如何应对这种需求的。



/**
 * 如果绝味又想开一家湖南的分店时,因为湖南喜欢吃麻的
 * 所以这是有需要有一家湖南的工厂专门制作.
 */
public class HuNanFactory extends AbstractFactory {
    @Override
    public YaBo createYaBo() {
        return null;
    }

    @Override
    public YaJia createYaJia() {
        return null;
    }
}


/**
 * 湖南鸭脖.
 */
public class HuNanYaBo extends YaJia {
    @Override
    protected void print() {
        System.out.println("湖南鸭脖");
    }
}


/**
 * 湖南的鸭架.
 */
public class HuNanYaJia extends YaJia {
    @Override
    protected void print() {
        System.out.println("湖南的鸭架");
    }
}

四、抽象工厂的优缺点

优点:抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建
封装起来,可以减少客户端与具体产品类之间的依赖,从而降低系统耦合度,这样有
利于后期的维护和扩展。

缺点:抽象工厂很难支持新品种的变化。这是因为抽象工厂中的接口已经确定可以被
创建的产品集合,如果需要添加新产品,此时就必须修改抽象工厂的接口,这样就违
背了“开放-封闭”原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值