设计模式-2-抽象工厂方法
一、概述
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-抽象工厂方法相关推荐
- 初学 Java 设计模式(三):实战抽象工厂方法模式 「QQ 厘米秀装扮」
一.抽象工厂方法模式介绍 1. 解决的问题 通过接口的选择,解决在系统产品存在多个产品族,而系统仅消费某一族的产品的问题. 2. 定义 抽象工厂模式是一个围绕超级工厂创建其他工厂的模式,即抽象工厂是一 ...
- 设计模式 第二天 工厂方法模式、抽象工厂方法模式、单例模式、代理模式
1 昨日回顾 继承的耦合度是最高的 因为有父类的完全方法 比聚合还高 2 工厂方法模式(从这里开始就是GOF讲的23种设计模式中的内容了 简单工厂模式违背了开闭原则, 对简单的工厂模式进行改造: 工厂 ...
- Android设计模式——抽象工厂方法模式
1.抽象工厂方法模式:为了创建一组或相互依赖的对象提供一个接口,而不需要指定它们是具体类--无语 2.找个代码看看: 抽象工厂类<成员为接口> /*** 抽象工厂**/ public ab ...
- 设计模式系列·抽象工厂模式
前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...
- 设计模式三—抽象工厂模式
设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...
- C++设计模式之抽象工厂模式
问题描述 之前讲到了C++设计模式--工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Produ ...
- 设计模式之四(抽象工厂模式第三回合)
原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...
- 抽象工厂模式设计模式_抽象工厂设计模式解释
抽象工厂模式设计模式 抽象工厂设计模式是工厂设计模式的另一种形式. 这种模式可以被视为"超级工厂"或"工厂工厂". 抽象工厂设计模式(属于"四人帮&q ...
- Android设计模式之——抽象工厂模式
一.介绍 抽象工厂模式(Abstract Factory Pattern),也是创建型设计模式之一.前一节我们已经了解了工厂方法模式,那么这个抽象工厂又是怎么一回事呢?大家联想一下现实生活中的工厂肯定 ...
最新文章
- SSM框架整合(Spring+SpringMVC+MyBatis)
- docker omv 防火墙_OpenMediaVault(OMV)配置Docker
- 老虞学GoLang笔记-数组和切片
- CentOS7.6 MySQL8环境搭建 配置远程登录 字符集UTF8 简单密码
- WPF笔记(1.1 WPF基础)——Hello,WPF!
- 【转】请让孩子输在起跑线上
- ASP.net的RUL重写
- 南非看世界杯通信问题全攻略(世界杯与通信1)
- android开发之自定义AutoCompleteTextView
- sharepoint SSP(shared services providers ) 配置
- 100道MySQL数据库经典面试题解析(收藏版)
- 中国各省的简称及简称的由来
- 上海交通大学python期末考试样题加解析_上海交通大学python期末考试样题加解析.doc...
- 微信内置浏览器缓存清理 微信缓存清除 清除微信里的h5缓存
- MATLAB常用快捷键总结
- 〇、什么是全栈工程师
- 尝美食、看演出、听音乐…南亚风情第壹城非遗文化节继续等你玩
- 你都有哪些面试时被虐的经历?
- DVD管理系统修改版
- 初次了解polyfill