抽象工厂模式的适用:

一个系统要独立于它的产品的创建、组合和表示时。

一个系统要由多个产品系列中的一个来配置时。

当你要强调一系列相关的产品对象的设计以便进行联合使用时。

当你提供一个产品类库,而只想显示它们的接口而不是实现时。

示例说明:

有三种抽象的产品:墙、门、房间。

对这三种抽象产品有两组具体实现:卧室和起居室。

那么,我们的抽象工厂就可以根据客户的指令(即调用参数)去生产卧室和起居室的房间(墙和门包括在房间里)。

测试启动类:

package com.alex.designpattern.abstractfactory;

/** *//**

* 抽象工厂模式

*

* 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

*

* @author huqi

* @serialData 2007

*/

public class Test ...{

public static void main(String[] args) throws Exception ...{

// ----- Create Living Room

Room myLivingRoom = AbstractRoomFactory.createRoom("LivingRoom");

AbstractRoomFactory.showRoom(myLivingRoom);

// ----- Create Bed Room

Room myBedRoom = AbstractRoomFactory.createRoom("BedRoom");

AbstractRoomFactory.showRoom(myBedRoom);

}

}

抽象产品:

package com.alex.designpattern.abstractfactory;

/** *//**

* The Abstract Class of Wall

*/

public interface Wall ...{

public String getName();

}

package com.alex.designpattern.abstractfactory;

/** *//**

* The Abstract Class of Door

*/

public interface Door ...{

public String getName();

}

package com.alex.designpattern.abstractfactory;

/** *//**

* The Abstract Class of Room

*/

public interface Room ...{

public Wall getWall();

public Door getDoor();

}

实际产品_1

package com.alex.designpattern.abstractfactory;

/** *//**

* A concrete Room - Bed Room

*/

public class BedRoom implements Room ...{

public BedRoom() ...{

System.out.println("Initiated a bedroom.");

}

public Door getDoor() ...{

return new BedRoomDoor();

}

public Wall getWall() ...{

return new BedRoomWall();

}

}

package com.alex.designpattern.abstractfactory;

/** *//**

* A concrete Door for Bed Room

*/

public class BedRoomDoor implements Door ...{

private String doorName;

public BedRoomDoor() ...{

doorName = "BedRoomDoor";

}

public String getName() ...{

return doorName;

}

}

package com.alex.designpattern.abstractfactory;

/** *//**

* A concrete Wall for Bed Room

*/

public class BedRoomWall implements Wall ...{

private String wallName;

public BedRoomWall() ...{

wallName = "BedRoomWall";

}

public String getName() ...{

return wallName;

}

}

实际产品_2

package com.alex.designpattern.abstractfactory;

/** *//**

* A concrete Room - Living Room

*/

public class LivingRoom implements Room ...{

public LivingRoom() ...{

System.out.println("Initiated a livingroom.");

}

public Door getDoor() ...{

return new LivingRoomDoor();

}

public Wall getWall() ...{

return new LivingRoomWall();

}

}

package com.alex.designpattern.abstractfactory;

/** *//**

* A concrete Door for Living Room

*/

public class LivingRoomDoor implements Door ...{

private String doorName;

public LivingRoomDoor() ...{

doorName = "LivingRoomDoor";

}

public String getName() ...{

return doorName;

}

}

package com.alex.designpattern.abstractfactory;

/** *//**

* A concrete Wall for Living Room

*/

public class LivingRoomWall implements Wall ...{

private String wallName;

public LivingRoomWall() ...{

wallName = "LivingRoomWall";

}

public String getName() ...{

return wallName;

}

}

最后,当然就是抽象工厂咯,不过要注意,这个抽象工厂的意思并不是这个“工厂”是抽象的,而是这个“工厂”加工的“产品”是来自于抽象的。

package com.alex.designpattern.abstractfactory;

/** *//**

* A Room Maker to test our simple Room Abstract Factory.

*

* @author huqi

* @serialData 2007

*/

public abstract class AbstractRoomFactory ...{

public static Room createRoom(String roomType) throws Exception ...{

if (roomType.equals("LivingRoom")) ...{

return new LivingRoom();

} else if (roomType.equals("BedRoom")) ...{

return new BedRoom();

} else ...{

throw new Exception("No this type room: " + roomType);

}

}

public static void showRoom(Room room) ...{

Door door = room.getDoor();

System.out.println("Room door name is: " + door.getName());

Wall wall = room.getWall();

System.out.println("Room wall name is: " + wall.getName());

}

}

java抽象工厂设计模式_23种经典设计模式的java实现_1_抽象工厂模式相关推荐

  1. 23种经典设计模式都有哪些,如何分类?Java设计模式相关面试

    23种经典设计模式都有哪些,如何分类? 23种经典设计模式都有哪些,如何分类? java常用的设计模式?说明工厂模式 Java 中的23 种设计模式: Factory(工厂模式), Builder(建 ...

  2. 23种经典设计模式的原理、背后的思想、应用场景(下)

    对程序员来说,除了算法,设计模式也是提升代码能力的关键技能,今天我就想跟你聊聊 23种经典的设计模式. 23种经典设计模式共分为3种类型,分别是创建型.结构型和行为型.今天,我们把这3种类型分成3个对 ...

  3. C++之23种经典设计模式(一)

    C++之23种经典设计模式(一) C++之23种经典设计模式(一) 单例模式(Singleton) 原型模式(Prototype) 工厂模式(Factory) C++之23种经典设计模式(一) 在偶然 ...

  4. 设计模式之委派模式(不属于23种经典设计模式之一)

    介绍 标准定义:委派模式的原理为类B和类A是两个互相没有任何关系的类,B具有和A一模一样的方法和属性,并且调用B中的方法.属性就是调用A中同名的方法和属性.B好像就是一个受A授权委托的中介.第三方的代 ...

  5. Java两种设计模式_23种设计模式(11)java策略模式

    23种设计模式第四篇:java策略模式 定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这 ...

  6. [设计模式] GoF 23种经典设计模式

    原文链接:https://www.yuque.com/cppdev/patterns/zainii 「GOF设计模式」Gang of Four,四人帮.设计模式的经典书籍<设计模式--可复用面向 ...

  7. java对接支付宝微信银联_经典设计模式之策略模式【如何重构聚合支付平台,对接【支付宝,微信,银联支付】】(示例代码)...

    写在前面:设计模式源于生活,而又高于生活! 为什么要使用设计模式重构代码 使用设计模式可以重构整体架构代码.提高代码复用性.扩展性.减少代码冗余问题. Java高级工程师装逼的技能! 什么是策略模式 ...

  8. [转]23种经典设计模式的java实现_5_职责链模式

    对于职责链模式,一般是这么定义的:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,即--将这些对象连成一条(处理)链,并沿着这条链传递该请求,直到这条链结束同时有一个对象处理它 ...

  9. 23种经典设计模式的java实现_3_桥接模式

    桥接模式的适用: 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如:程序的实现部分在运行时需要被选择或者切换. 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充.这时Bridge模式 ...

最新文章

  1. 深度学习计算机视觉常见的29道面试题及解析
  2. 渗透攻击(NT/2000系统)
  3. java 负载均衡_java负载均衡 - 岁月静好I的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. 有关mysql的开发介绍_深入浅出MySQL之开发篇(二)
  5. 机器学习基础算法11-Logistic回归-ROC和AUC分类模型评估-实例
  6. 『动态规划』最大子段和
  7. MySQL图书借阅系统项目数据库建库表语句(组合主键、外键设置)
  8. 纸壳cms php,纸壳CMS 3.4 发布,电商功能增强
  9. word2016+endnoteX7的安装与配置
  10. SAP中物料需求计划不考虑库存策略应用案例
  11. 飞信登录时SIPC认证失败解决
  12. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
  13. flink stream 终于上local 集群 运行起来
  14. 台式计算机打印机共享,如何连接共享打印机,教您电脑如何连接共享打印机
  15. 2022年国赛B题(处女作---河南省级三等奖)
  16. RIKIBOT-FX4多线激光雷达用谷歌cartographer构建3D地图
  17. 单片机测量NTC热敏电阻温度的方法(含程序代码)
  18. AI二次开发C#使用RGBColor
  19. C语言自定义打印宏函数
  20. 红米K30S Ultra的root步骤 之二(MIUI 13.0.1 稳定版 安卓12)

热门文章

  1. leetcode 452. Minimum Number of Arrows to Burst Balloons | 452. 用最少数量的箭引爆气球(左程云:最大线段重合问题)
  2. 左神算法:环形单链表的约瑟夫问题(Java版)
  3. Redis实战(一):Redis一键安装脚本,Redis 介绍及 NIO 原理介绍
  4. 带你理清 Java 混乱的日志体系 - log4j、logback、log4j2、jcl、SLFJ 究竟是啥关系?
  5. 安全声明标记语言SAML2.0初探
  6. Leet Code OJ 125. Valid Palindrome [Difficulty: Easy]
  7. mysql的水平分表和垂直分表的区别
  8. C/C++数组指针和指针数组
  9. jQuery.ready() 函数详解
  10. SpringMvc执行过程