一、概述

1-抽象工厂
提供一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体的实现类
2-设计原则
(1)开闭(2)多用组合,少继承
抽象工厂和工厂方法的区别
(1)工厂通过继承解耦;抽象工厂通过组合解耦
(2)工厂用于创建一个抽象产品,具体的工厂用于创建具体的产品;抽象工厂用于创建一个产品家族的抽象类型
3-使用场合
(1)创建产品家族
(2)提供一个产品库,并只想显示器接口而非实现
========抽象食物接口
package SheJiMoShiNaDianShi.AbstractFactory.model;/*** Created by hjw on 16/8/28.* 食物辅助接口,用于实现共性,如打印信息*/
public interface IFood {public void printMessage();
}========抽象食物package SheJiMoShiNaDianShi.AbstractFactory.model;/*** Created by hjw on 16/8/28.* 抽象的食物对象*/
public abstract class AbstractBaseFood {//类别protected String kind;//数量protected int num;//单价protected float price;//总价public float totalPrice() {return this.num * this.price;}
}========抽象食物鸡翅
package SheJiMoShiNaDianShi.AbstractFactory.model;/*** Created by hjw on 16/8/28.*/
public abstract class ChickenWings extends AbstractBaseFood implements IFood{@Overridepublic void printMessage() {System.out.println("----"+this.kind+"风味鸡翅,\t 单价:"+this.price + ", \t数量:"+this.num+", \t总计:"+this.totalPrice());}
}========抽象食物汉堡
package SheJiMoShiNaDianShi.AbstractFactory.model;/*** Created by hjw on 16/8/28.* 创建不同食物的抽象类*/
public abstract class Hamburg extends AbstractBaseFood implements  IFood{@Overridepublic void printMessage() {System.out.println("----"+this.kind+"风味汉堡,\t 单价:"+this.price + ", \t数量:"+this.num+", \t总计:"+this.totalPrice());}
}========具体食物鸡翅
package SheJiMoShiNaDianShi.AbstractFactory.model.kfc;import SheJiMoShiNaDianShi.AbstractFactory.model.ChickenWings;/*** Created by hjw on 16/8/28.* 鸡翅实现类*/
public class ChinaChickenWings extends ChickenWings {/*** 构造函数* @param kind* @param price* @param num*/public ChinaChickenWings(String kind,float price,int num) {this.kind = kind;this.price = price;this.num = num;}}========具体食物汉堡
package SheJiMoShiNaDianShi.AbstractFactory.model.kfc;import SheJiMoShiNaDianShi.AbstractFactory.model.Hamburg;/*** Created by hjw on 16/8/28.* 创建具体的食物*/
public class ChinaHamburg extends Hamburg {/*** 构造函数* @param kind* @param price* @param num*/public ChinaHamburg(String kind,float price,int num) {this.kind = kind;this.price = price;this.num = num;}
}========抽象工厂接口
package SheJiMoShiNaDianShi.AbstractFactory.itf;import SheJiMoShiNaDianShi.AbstractFactory.model.ChickenWings;
import SheJiMoShiNaDianShi.AbstractFactory.model.Hamburg;/*** Created by hjw on 16/8/28.* 抽象工厂接口*/
public interface IKfcFactory {public Hamburg creatHamburg(String kind,float price,int num);public ChickenWings creatChichenWings(String kind,float price,int num);
}========具体工厂
package SheJiMoShiNaDianShi.AbstractFactory.itf;import SheJiMoShiNaDianShi.AbstractFactory.model.ChickenWings;
import SheJiMoShiNaDianShi.AbstractFactory.model.Hamburg;
import SheJiMoShiNaDianShi.AbstractFactory.model.kfc.ChinaChickenWings;
import SheJiMoShiNaDianShi.AbstractFactory.model.kfc.ChinaHamburg;/*** Created by hjw on 16/8/28.* 具体的工厂*/
public class ChinaKfcFactory implements IKfcFactory {@Overridepublic Hamburg creatHamburg(String kind, float price, int num) {return new ChinaHamburg(kind, price, num);}@Overridepublic ChickenWings creatChichenWings(String kind, float price, int num) {return new ChinaChickenWings(kind, price, num);}
}=====客户类-通过工厂暴露的方法实现具体对象的创建
package SheJiMoShiNaDianShi.AbstractFactory.custom;import SheJiMoShiNaDianShi.AbstractFactory.itf.IKfcFactory;
import SheJiMoShiNaDianShi.AbstractFactory.model.ChickenWings;
import SheJiMoShiNaDianShi.AbstractFactory.model.Hamburg;/*** Created by hjw on 16/8/28.* 客户类-通过工厂暴露的方法实现具体对象的创建*/
public class Custom {IKfcFactory iKfcFactory;public Custom(IKfcFactory iKfcFactory) {this.iKfcFactory = iKfcFactory;}public float orderHamburg(String kind, float price, int num){Hamburg hamburg =  iKfcFactory.creatHamburg(kind, price, num);hamburg.printMessage();return hamburg.totalPrice();}public float orderChickenWings(String kind, float price, int num){ChickenWings chickenWings = iKfcFactory.creatChichenWings(kind, price, num);chickenWings.printMessage();return chickenWings.totalPrice();}
}=====app
package SheJiMoShiNaDianShi.AbstractFactory;import SheJiMoShiNaDianShi.AbstractFactory.custom.Custom;
import SheJiMoShiNaDianShi.AbstractFactory.itf.ChinaKfcFactory;
import SheJiMoShiNaDianShi.AbstractFactory.itf.IKfcFactory;/*** Created by hjw on 16/8/28.*/
public class MainApp {public static void main(String[] args) {IKfcFactory iKfcFactory = new ChinaKfcFactory();Custom custom = new Custom(iKfcFactory);float hamburgMoney = custom.orderHamburg("麻辣", 1.2f, 2);float chichenWingsMoney = custom.orderChickenWings("奥尔良", 2, 4);System.out.println("总计: " + (hamburgMoney + chichenWingsMoney));}
}
												

设计模式-2-抽象工厂方法相关推荐

  1. 初学 Java 设计模式(三):实战抽象工厂方法模式 「QQ 厘米秀装扮」

    一.抽象工厂方法模式介绍 1. 解决的问题 通过接口的选择,解决在系统产品存在多个产品族,而系统仅消费某一族的产品的问题. 2. 定义 抽象工厂模式是一个围绕超级工厂创建其他工厂的模式,即抽象工厂是一 ...

  2. 设计模式 第二天 工厂方法模式、抽象工厂方法模式、单例模式、代理模式

    1 昨日回顾 继承的耦合度是最高的 因为有父类的完全方法 比聚合还高 2 工厂方法模式(从这里开始就是GOF讲的23种设计模式中的内容了 简单工厂模式违背了开闭原则, 对简单的工厂模式进行改造: 工厂 ...

  3. Android设计模式——抽象工厂方法模式

    1.抽象工厂方法模式:为了创建一组或相互依赖的对象提供一个接口,而不需要指定它们是具体类--无语 2.找个代码看看: 抽象工厂类<成员为接口> /*** 抽象工厂**/ public ab ...

  4. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

  5. 设计模式三—抽象工厂模式

    设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...

  6. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...

  7. C++设计模式之抽象工厂模式

    问题描述 之前讲到了C++设计模式--工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Produ ...

  8. 设计模式之四(抽象工厂模式第三回合)

    原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...

  9. 抽象工厂模式设计模式_抽象工厂设计模式解释

    抽象工厂模式设计模式 抽象工厂设计模式是工厂设计模式的另一种形式. 这种模式可以被视为"超级工厂"或"工厂工厂". 抽象工厂设计模式(属于"四人帮&q ...

  10. Android设计模式之——抽象工厂模式

    一.介绍 抽象工厂模式(Abstract Factory Pattern),也是创建型设计模式之一.前一节我们已经了解了工厂方法模式,那么这个抽象工厂又是怎么一回事呢?大家联想一下现实生活中的工厂肯定 ...

最新文章

  1. SSM框架整合(Spring+SpringMVC+MyBatis)
  2. docker omv 防火墙_OpenMediaVault(OMV)配置Docker
  3. 老虞学GoLang笔记-数组和切片
  4. CentOS7.6 MySQL8环境搭建 配置远程登录 字符集UTF8 简单密码
  5. WPF笔记(1.1 WPF基础)——Hello,WPF!
  6. 【转】请让孩子输在起跑线上
  7. ASP.net的RUL重写
  8. 南非看世界杯通信问题全攻略(世界杯与通信1)
  9. android开发之自定义AutoCompleteTextView
  10. sharepoint SSP(shared services providers ) 配置
  11. 100道MySQL数据库经典面试题解析(收藏版)
  12. 中国各省的简称及简称的由来
  13. 上海交通大学python期末考试样题加解析_上海交通大学python期末考试样题加解析.doc...
  14. 微信内置浏览器缓存清理 微信缓存清除 清除微信里的h5缓存
  15. MATLAB常用快捷键总结
  16. 〇、什么是全栈工程师
  17. 尝美食、看演出、听音乐…南亚风情第壹城非遗文化节继续等你玩
  18. 你都有哪些面试时被虐的经历?
  19. DVD管理系统修改版
  20. 初次了解polyfill

热门文章

  1. 2021有效的电子邮箱号码大全,外贸企业邮箱地址大全
  2. 前端工程师面试题汇总(我的解析,可能不一定对)(HTML部分)
  3. SqlServer使用top 100 PERCENT 无法排序的问题
  4. 【数据结构】哈夫曼编码
  5. 设计模式之禅(一)——六大设计原则
  6. 智能制造专业就业方向
  7. linux 校园网 自动认证,使用 Padavan 路由器实现校园网自动 Web 认证
  8. Excel中Sheet(s)和Worksheet(s)的区别
  9. 使用Google Analytics来统计手机网站的流量
  10. react中使用swiper