工厂模式[3] 抽象工厂 Abstract Factory

简介


1、简单工厂,或静态工厂,产品接口
  • 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口
  • 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的构造方法是怎么new的),消除了客户端直接创建产品对象的责任,实现了对责任的分割。
  • 缺点:工厂类记录了所有产品的创建逻辑,一旦不能正常工作,整个系统都会受到影响;而且当产品种类多、结构复杂的时候,把所有创建工作放进一个工厂中来,会使后期程序的扩展较为困难。
2、工厂方法,工厂接口+产品接口
  • 定义:在简单工厂的基础上,为工厂类定义了工厂接口,让其子类决定实例化哪个产品类。
  • 优点:简单工厂是把创建产品的职能都全部放在一个类里面,而工厂方法则是把不同的产品放在实现了工厂接口的不同工厂类里面,分割了工厂类的职能。
3、抽象工厂
  • 定义:抽象工厂提供一个固定的接口,用于创建一系列由关联或者相依存的对象,而不必指定其具体类或其创建的细节
工厂方法用来创建一个产品,它没有分类的概念,而抽象工厂则用于创建一系列产品,所以产品分类成了抽象工厂的重点。
工厂方法:一抽象产品类派生出多个具体产品类;一抽象工厂类派生出多个具体工厂类;【每个】具体工厂类只能创建【一个】具体产品类的实例。 即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)。【一对一】的关系。 抽象工厂:多个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;【每个】具体工厂类可创建【多个】具体产品类的实例。 即提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体的类。【一对多】的关系。

抽象工厂


先修改人类定义的接口


/**

 * 定义一个人类的统称,问题出来了,刚刚定义的时候忘记定义性别了,这个重要的问题非修改不可,否则这个世界上太多太多的东西不存在了

 */

public interface IHuman {

    public void talk();

    //定义性别,注意,这个是用来给人类【分类】的,在抽象工厂中,很重要的一步就是合理的分类

    public void sex();

}


人类的接口定义好,然后根据接口创建两个抽象类,也就是两个【产品等级】,其实,抽象类的目的就是不允许你 new。 public abstract class AbstractWhiteHuman implements IHuman {     @Override     public void talk() {         System.out.println("白色人种会说English");     } } public abstract class AbstractYellowHuman implements IHuman {     @Override     public void talk() {         System.out.println("黄种人会说汉语");     } }
然后就是些实现类了 public class YellowFemaleHuman extends AbstractYellowHuman {     @Override     public void sex() {         System.out.println("女性黄种人");     } } public class YellowMaleHuman extends AbstractYellowHuman {     public void sex() {         System.out.println("男行黄种人");     } }
抽象工厂模式下的【产品等级】和【产品族】都已经完成,下一步就等着工厂开工创建了,那我们来看工厂类。 在看工厂类之前我们先看那个枚举类型 public enum HumanEnum {     //把世界上所有人类型都定义出来     YelloMaleHuman("AbstractFactory.YellowMaleHuman"), YelloFemaleHuman("AbstractFactory.YellowFemaleHuman"), //     WhiteFemaleHuman("AbstractFactory.WhiteFemaleHuman"), WhiteMaleHuman("AbstractFactory.WhiteMaleHuman");     private String value="";     //定义构造函数,目的是Data(value)类型的相匹配     private HumanEnum(String value) {         this.value = value;     }     public String getValue() {         return this.value;     } }



然后,我们看我们的工厂类,先看接口 /**  * 定一个烤箱,泥巴塞进去,人就出来  */ public interface IHumanFactory {     //制造黄色人种     public IHuman createYellowHuman();     //制造一个白色人种     public IHuman createWhiteHuman(); }
然后看工厂的抽象类 public abstract class AbstractHumanFactory implements IHumanFactory {     //给定一个性别人种,创建一个人类出来 专业术语是产生产品等级     protected IHuman createHuman(HumanEnum humanEnum) {         IHuman human = null;         if (!humanEnum.getValue().equals("")) {//如果传递进来不是一个Enum中具体的一个Element的话,则不处理             try {                 human = (IHuman) Class.forName(humanEnum.getValue()).newInstance();//直接产生一个实例             } catch (Exception e) {//因为使用了enum,这个种异常情况不会产生了,除非你的enum有问题;                 e.printStackTrace();             }         }         return human;     } } 看到没,这就是引入 enum 的好处,createHuman(HumanEnum humanEnum)这个方法定义了输入参数必须是 HumanEnum 类型,然后直接使用 humanEnum.getValue()方法就能获得具体传递进来的值。 这个抽象类的目的就是减少下边实现类的代码量。
我们看实现类 /**  * 男性创建工厂,只创建男性  */ public class MaleHumanFactory extends AbstractHumanFactory {     //创建一个男性白种人     @Override     public IHuman createWhiteHuman() {         return super.createHuman(HumanEnum.WhiteMaleHuman);     }     //创建一个男性黄种人     @Override     public IHuman createYellowHuman() {         return super.createHuman(HumanEnum.YelloMaleHuman);     } } /**  * 女性创建工厂,只创建女性  */ public class FemaleHumanFactory extends AbstractHumanFactory {     //创建一个女性白种人     @Override     public IHuman createWhiteHuman() {         return super.createHuman(HumanEnum.WhiteFemaleHuman);     }     //创建一个女性黄种人\     @Override     public IHuman createYellowHuman() {         return super.createHuman(HumanEnum.YelloFemaleHuman);     } }
产品定义好了,工厂也定义好了,万事俱备只欠东风,那咱就开始造人吧,哦,不对,女娲开始造人了:

public class Test {

//女娲建立起了两条生产线,分别是男性生产线和女性生产线

public static void main(String[] args) {

//第一条生产线,男性生产线,可以生产各种各样的男性

IHumanFactory maleHumanFactory = new MaleHumanFactory();

IHuman maleYellowHuman = maleHumanFactory.createYellowHuman();//生产黄色的男性

IHuman maleWhiteHuman = maleHumanFactory.createWhiteHuman();//生产白色的男性

maleYellowHuman.sex();

maleWhiteHuman.sex();

System.out.println("\n\n");

//第二条生产线,女性生产线,可以生产各种各样的女性

IHumanFactory femaleHumanFactory = new FemaleHumanFactory();

IHuman femaleYellowHuman = femaleHumanFactory.createYellowHuman();//生产黄色的女性

IHuman femaleWhiteHuman = femaleHumanFactory.createWhiteHuman();//生产白色的女性

femaleYellowHuman.sex();

femaleWhiteHuman.sex();

}

}

来自为知笔记(Wiz)

附件列表

时间: 2024-10-21 07:18:05

工厂模式[3] 抽象工厂 Abstract Factory的相关文章

Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]

 1 2 {<HeadFirst设计模式>工厂模式之抽象工厂 } 3 { 抽象工厂的产品                       } 4 { 编译工具:Delphi7.0                  } 5 { E-Mail :[email protected]          } 6 7unit uPizzaIngredient; 8 9interface1011type12  TDough = class(TObject)13  end;1415  TThinCrustDoug

工厂模式和抽象工厂模式

工厂模式: 定义一个用于创建对象的接口,让他的子类决定实例化哪个类.使类的实例化延迟到子类. 1.普通的工厂模式: public class GoodProduct implements Product { private String prodInfo = "Iam the good prod"; public String getProductInfo() { // TODO Auto-generated method stub return this.prodInfo; } pu

Objective-C 工厂模式(下) -- 抽象工厂模式

相比简单工厂模式, 只有一个工厂 能生产的手机也是固定的 抽象工厂模式类似于有很多家工厂, 当用户要买什么手机就创建对应的工厂去生产 比如用户要买iPhone就创建一个Apple工厂来生产手机, 要买Android手机就创建一个Goolge工厂 这样创建工厂, 工厂, 用户这样就是我们要考虑的因素 (其实还有手机, 这里就跳过不讲了跟简单工厂模式里面一样) 创建工厂要有一个管理对象, 来根据客户的需求自动创建相应的工厂 工厂只要负责生产手机就好了 现在来构建代码 先写一个基本工厂模型 BaseF

[设计模式篇]工厂模式和抽象工厂模式

最近在看Head First的Design Pattern,想想去年候捷来学校给我们讲Design Pattern,但当时水平太弱根本听不懂,今年想趁机再好好学一波,候捷反而不来了,哎,人生就是这样,有些机会真的搞不好只有一次了,所以还是要多多珍惜,不然... ... (再水下去估计没人看了,废话少说,这篇就当一个开篇之作吧,虽然已经看了不少了.) Head First这本书用了一个披萨店的例子,从简单工厂(严格来说这不算一种Gof的设计模式,更像是一种编程习惯),到介绍工厂模式,再介绍到抽象工

设计模式学习(二)——简单工厂模式、工厂模式、抽象工厂模式

最近抽时间将之前看过的"程序人生"公众号推送的一篇工厂模式的介绍进行了实践,为了加深自己理解,特将自己的学习理解记录于此.初识设计模式,就被设计模式的精妙深深吸引,感觉脱离设计模式的代码就失去了美丽.作为一个测试,平日写代码的机会肯定不如开发多,但是希望自己能通过努力逐步提升代码水平,有一天也能写出优美的代码.如果有对于工厂模式或其他设计模式感兴趣的朋友欢迎一起探讨. 一.简单工厂模式 定义:专门定义一个类用来创建其他类的实例,被创建的实例通常具有共同的父类. 场景一:恰巧今天,老大兴

设计模式--工厂模式和抽象工厂模式

工厂模式的英文原文是:Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory method lets a class defer instantiation to subclass. 意思是定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到子类. 工厂模式主要是为创建对象提供了接口,工厂模式可分为三类: 简单

【设计模式】重新理解简单工厂模式、工厂模式、抽象工厂模式

最近后台工作部分还算顺利,数据库Dao层使用简单工厂模式,一开始自己还是觉得是工厂模式,因为我没有深入了解过简单工厂模式与工厂模式的区别,后来通过复习工厂模式的时候才发现自己的理解是错误的. 在后台数据库层开发部分,自己定义了Dao接口用于表示对数据库操作的动作.对应每个Dao都有一个实现类对应,然后通过定义一个Factory类通过静态方法获取Dao接口的实例. 其实这种方式是属于简单工厂模式,而不是工厂模式,因为工厂模式中工厂类也是一个接口,产品接口通过工厂类的实例构建出来,看看下面的描述:

工厂模式之抽象工厂模式

图显示有问题.可直接看: 点击打开链接 场景问题 举个生活中常见的样例--组装电脑,我们在组装电脑的时候.通常须要选择一系列的配件,比方CPU.硬盘.内存.主板.电源.机箱等. 为讨论使用简单点,仅仅考虑选择CPU和主板的问题. 其实.在选择CPU的时候.面临一系列的问题,比方品牌.型号.针脚数目.主频等问题.仅仅有把这些问题都确定下来,才干确定详细的CPU. 相同,在选择主板的时候.也有一系列问题.比方品牌.芯片组.集成芯片.总线频率等问题,也仅仅有这些都确定了,才干确定详细的主板. 选择不同

6创建型模式之工厂模式与抽象工厂模式

工厂模式 概念 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 . 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 类图角色和职责 抽象工厂(Creator)角色 工厂方法模式的核心,任何工厂类都必须实现这个接口. 具体工厂( Concrete  Creator)角