(三)抽象工厂模式

来源:互联网 发布:深圳大数据研究院 编辑:程序博客网 时间:2024/05/22 01:27

一,抽象工厂的出现

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

二、 抽象工厂的具体实现

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

/** * 下面以绝味鸭脖连锁店为例子,演示抽象工厂模式 * 因为每个地方喜欢的口味不同,有些地方喜欢辣点的,有的地方不喜欢吃辣 * <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("湖南的鸭架");    }}

四、抽象工厂的优缺点

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

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 科三包过不给退钱人跑了怎么办 护师职称考试成绩单丢了怎么办 河南二级建造师报名地址填错怎么办 山东以前的企业没有消防备案怎么办 重庆渝北初级审核时间过了怎么办 初级职称复核毕业证弄丢了怎么办 杭州公租房选房后变更单位的怎么办 契税交了贷款办不下来怎么办 天津公租房住满5年后怎么办 大江里钓鱼水流太急立不住漂怎么办 房子定金交了不想要了怎么办 房子付了首付不想要了怎么办 三国大时代4王越死了任务怎么办 红米2卡顿反应慢怎么办 国税和地税合并新进的公务员怎么办 买车合格证不给我们要怎么办 初级会计报名信息表填写错误怎么办 跨国快递需要收件人自行清关怎么办 腋下有异味怎么办邀约成都真愛 腋下有异味怎么办犀利成都真愛 腋下有异味怎么办有信成都真愛 成都车牌网上选号次数用完了怎么办 在志愿服务中遇到突发状况怎么办 商铺没有房产证不能办理消防怎么办 亳州办事大厅登录密码忘记了怎么办 户口已迁出结婚证丢了怎么办 户口已迁出多年结婚证丢了怎么办 芜湖长信正式工没转正怎么办辞职 买到9个月库存车怎么办 买到5个月库存车怎么办 把4s店新车撞了怎么办 网址导航已取消打不开网页是怎么办 如果邦华手机充电口有杂物怎么办? 当发生灾害或突发事故时怎么办 物流信息和和收货地址不一样怎么办 小孩手被电梯门夹了怎么办 车管所50选一没看中的号码怎么办 长沙芙蓉区电动车被交警扣了怎么办 驾照正在考的时候住址变了怎么办 身份证到期了驾驶证上的号码怎么办 小车占道跟大车刮交警怎么办