设计模式6 - 抽象工厂模式【Abstract Factory Pattern】

简介: 设计模式6 - 抽象工厂模式【Abstract Factory Pattern】

抽象工厂模式

定义:

所有形态的工厂模式中最为抽象和最具一般性的一种形态,为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

例子:

分析:

接上一节”女娲造人例子”,有了丹炉去造人了,但是问题来了,新增了一个需求,造的人需要增加性别。简单的说,就是在工厂里面,生产的每一个实体,里面都有一个获取性别的方法。

同时:

也要也要增加分为男性和女性的工场。

直接上代码:

人类模块:

/**
* 人类接口
*/
public interface Human { 
    public void laugh(); 
    public void cry(); 
    public void talk(); 
    public void sex(); 
} 
/**
* 定义为抽象类,因为子类要定义性别
*/
public abstract class AbstractYellowHuman implements Human{ 
    public void cry() { 
         System.out.println("黄色人类会哭"); 
    } 
    public void laugh() { 
         System.out.println("黄色人类会大笑,幸福呀!"); 
    } 
    public void talk() { 
         System.out.println("黄色人类会说话,一般说的都是双字节"); 
    } 
} 
/**
* 女性黄种人
*/
public class YellowFemaleHuman extends AbstractYellowHuman{ 
    public void sex() { 
         System.out.println("该黄种人的性别为女..."); 
    } 
} 
/**
* 男性黄种人
*/
public class YellowMaleHuman extends AbstractYellowHuman { 
    public void sex() { 
         System.out.println("该黄种人的性别为男...."); 
    } 
} 

工厂模块:

/**
*工厂类接口
*/
public interface HumanFactory { 
    //制造黄色人类
    public Human createYellowHuman(); 
    //制造一个白色人类
    public Human createWhiteHuman(); 
    //制造一个黑色人类
    public Human createBlackHuman(); 
} 
/**
* 抽象工厂
*/
public abstract class AbstractHumanFactory implements HumanFactory { 
 //给定一个性别人类,创建一个人类出来 专业术语是产生产品等级
protected Human createHuman(HumanEnum humanEnum) { 
 Human human = null; 
 //如果传递进来不是一个Enum中具体的一个Element的话,则不处理
 if (!humanEnum.getValue().equals("")) { 
     try { 
         //直接产生一个实例
         human = (Human)Class.forName(humanEnum.getValue()).newInstance(); 
     } catch (Exception e) { 
         //因为使用了enum,这个种异常情况不会产生了,除非你的enum有问题;
         e.printStackTrace(); 
     } 
 return human; 
 } 
} 
/**
* 男性创建工厂
*/
public class MaleHumanFactory extends AbstractHumanFactory { 
    //创建一个男性黑种人
    public Human createBlackHuman() { 
         return super.createHuman(HumanEnum.BlackMaleHuman); 
    } 
    //创建一个男性白种人
    public Human createWhiteHuman() { 
         return super.createHuman(HumanEnum.WhiteMaleHuman); 
    } 
    //创建一个男性黄种人
    public Human createYellowHuman() { 
         return super.createHuman(HumanEnum.YelloMaleHuman); 
    } 
} 
/**
* 女性创建工厂
*/
public class FemaleHumanFactory extends AbstractHumanFactory { 
    //创建一个女性黑种人
    public Human createBlackHuman() { 
          return super.createHuman(HumanEnum.BlackFemaleHuman); 
      } 
    //创建一个女性白种人
    public Human createWhiteHuman() { 
          return super.createHuman(HumanEnum.WhiteFemaleHuman); 
    } 
//创建一个女性黄种人
public Human createYellowHuman() { 
          return super.createHuman(HumanEnum.YelloFemaleHuman); 
  } 
} 

主程序,开始造人

public class NvWa { 
    public static void main(String[] args) { 
         //第一条生产线,男性生产线
         HumanFactory maleHumanFactory = new MaleHumanFactory(); 
         //第二条生产线,女性生产线
         HumanFactory femaleHumanFactory = new FemaleHumanFactory(); 
         //生产线建立完毕,开始生产人了:
         Human maleYellowHuman = maleHumanFactory.createYellowHuman(); 
         Human femaleYellowHuman = femaleHumanFactory.createYellowHuman(); 
         maleYellowHuman.cry(); 
         maleYellowHuman.laugh(); 
         femaleYellowHuman.sex(); 
         .......
 } 
} 

总结:

抽象工厂模式,还有一个非常大的有点,高内聚,低耦合,在一个较大的项目组,产品是由一批人定义开发的,但是提供其他成员访问的时候,只有工厂方法和产品的接口,也就是说只需要提供Product Interface 和Concrete Factory 就可以产生自己需要的对象和方法,Java 的高内聚低耦合的特性表现的一览无遗,


目录
相关文章
|
8天前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
14 5
|
2月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
2月前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
34 2
|
5天前
|
设计模式 SQL 关系型数据库
抽象工厂模式-大话设计模式
抽象工厂模式-大话设计模式
10 1
|
22天前
|
设计模式 XML Java
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
三 结尾 如果文章中有什么不足,欢迎大家留言交流,感谢朋友们的支持! 如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号
23 5
|
3天前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
10天前
|
设计模式 Java 数据库连接
Java设计模式之抽象工厂模式详解
Java设计模式之抽象工厂模式详解
|
2月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
2月前
|
设计模式
设计模式之工厂 Factory
设计模式之工厂 Factory
23 1
|
23天前
|
设计模式 架构师 NoSQL
设计模式-工厂方法模式和抽象工厂模式
 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
193 0