设计模式之禅--抽象工厂模式

**

**象工厂模式的定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。

抽象工厂模式的通用类图

抽象工厂是工厂方法模式的升级版本,在多个业务品种、业务分类时,通过抽象工厂模式生产所需要的对象是一种非常好的方式。所以理论上讲,工厂模式能做的事抽象工厂模式来做也没有问题,高版本兼容低版本嘛~

开车了~

女娲造人后传

女娲造人之后发现造出来的人太单调了,因为忘记给人类定义性别了。那现在我们给人类加上性别。其实这里就是一个添加业务品种的过程。

看我们的UML图

见代码

//人类接口
public interface Human {
   public void getColor();
   public void talk();
   public void getSex();
}
//白色人种
public abstract class AbstractWhiteHuman implements Human {
    public void getColor(){
       System.out.println("白色人种的皮肤都是白色的");
    }
    public void talk(){
        System.out.println("白种人说话,一般说的都是单子节");
    }
}
//黑色人种
public abstract class AbstractBlackHuman implements Human {
   public void getColor() {
      System.out.println("黑色人种的皮肤颜色是黑色的!");
   }
   public void talk() {
      System.out.println("黑人说话,一般人都听不懂。");
   }
}
//黄色人种
public abstract class AbstractYellowHuman implements Human {
    public void getColor(){
        System.out.println("黄种人的皮肤是黄色的");
    }
    public void talk(){
        System.out.println("黄种人说话一般都是双字节的");
    }
}

每一个种类都会再有两个实现类,举例黄色人种

//女性
public class FemaleYellowHuman extends AbstractYellowHuman{
    public void getSex(){
        System.out.println("黄种人女性");
    }
}
//男性
public class maleYellowHuman extends AbstractYellowHuman{
    public void getSex(){
        System.out.println("黄种人男性");
    }
}
//工厂接口
public interface HumanFactory {
   public Human createBlaclHuman();
   public Human createYellowHuman();
   public Human createWhiteHuman();
}
//女性工厂
public class FemaleHumanFactory implements HumanFactory{
    public Human createBlackHuman(){
        return new FemaleBlackHuman();
    }
    ...//同上
}
//男性工厂
public class MaleHumanFactory implements HumanFactory{
    public Human createBlackHuman(){
        return new MaleBlackHuman();
    }
    ...//同上
}
//女娲重造人类场景类
public class NvWa{
//要造人首先得有工厂
        HumanFactory maleHumanFactory = new MaleFactory();
        HumanFactory femaleHumanFactory = new FemaleFactory();
//开始造人
        Human maleYellowHuman = maleHumanFactory.createYellowHuman();
        Human femaleYellowHuman = femaleHumanFactory.createYellowHuman();
    }
}

我理解的抽象工厂:

1、当业务类别产生时,我们使用工厂模式的升级版本—-抽象工厂模式,可以使代码逻辑十分清楚。

2、同时当业务类别特别多时,如果我们使用工厂模式,那我们就需要记住每个要产生的对象的名字(或指定的字符串),这对于团队来说是很不合理的,A写的代码B需要再去看一遍;但是如果使用抽象工厂就会有代码提示~这个我们肯定有体会

抽象工厂模式也有通用代码,根据上面的UML图可以很简单的得出来~

抽象工厂模式的优点

  • 封装性,每个产品的实现类不是高层模块要关心的,它要关心的是接口和抽象,它不关心对象是如何创造的。
  • 产品族的约束是非公开的,比如我生产一个左轮胎就需要生产一个右轮胎。这个是在工厂内默认的,高层模块根本不需要关心这个。

抽象工厂模式的缺点

  • 产品族的拓展性非常差,如果人类再有一种肤色X,那上面的HumanFactory就需要修改,然后它的两个实现类也需要修改,这严重违反了开闭原则
时间: 2024-11-08 22:16:06

设计模式之禅--抽象工厂模式的相关文章

设计模式学习03—抽象工厂模式

1.动机与定义 工厂模式中,一个工厂仅仅能提供一个或一类产品,当产品种类较多,形成产品系列(比方我们要创建跨平台的button,菜单,文本框等等一系列GUI控件: 单纯使用工厂模式会产生大量工厂,并且后期维护也不方便,我们能够从产品中找到规律,假设产品等级相对固定,以后仅仅会新增产品族,那么我们就能够把整个产品族放到一个工厂创建,以后新增其它系统产品族也很方便,例如以下图: 这样的模式就是抽象工厂,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则须要面对多个产品等级结构,一个工厂等级结构能

设计模式C++实现——抽象工厂模式

模式定义: 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道实际产出的具体产品时什么.这样一来,客户就从具体的产品中被解耦了. 模式结构: 举例: 数据库访问程序设计,不同的数据库访问方式可能不一样,为了抽象对对不同数据库的访问,可以将数据库隐藏起来,提供统一的访问方式,用多态进行实现. UML设计: 编程实现及执行结果: #include <iostream> using namespace st

读秦小波《设计模式之禅》 -- 工厂模式

设计模式是一种非常有用的编程技巧,它对于代码的重构有些非常重要的作用,对于软件开发人员来说,需要理解并尝试着使用这些设计的方法. 个人感觉<设计模式之禅>这本书中讲解的非常具体,每个模式都配以适当的例子,非常适合学习设计模式的初学者,当然,程杰的<大话设计模式>也是非常好的一本书,都可以拿过来当做一本工具书随时查看理解设计的奥妙. 工厂模式 这个模式的名字就已经告诉了我们它想要做什么,就是让我们构造出一个工厂,然后生产我们需要的东西,即生成对象.那么,为什么要构造一个工厂呢,为什么

设计模式学习-抽象工厂模式

1.定义 提供接口,创建一系列相关或独立的对象,而不指定这些对象的具体类. 2.类图 3.代码示例 1 package com.zhaoyangwoo.abstractfactory; 2 3 /** 4 * Created by john on 16/5/2. 5 * @author wuzhaoyang 6 * <p> 7 * 抽象工厂:多个抽象产品类,派生出多个具体产品类:一个抽象工厂类,派生出多个具体工厂类:每个具体工厂类可创建多个具体产品类的实例. 8 * 即提供一个创建一系列相关或

大话设计模式C++版——抽象工厂模式

前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种--抽象工厂模式(Abstract Factory),其是在工厂方法模式的基础上改进而来,如果没有弄明白工厂方法模式的同学请先观看<大话设计模式C++版--工厂方法模式>. 为什么会有抽象工厂模式?抽象工厂模式是简单工厂模式缺陷的终极解决方式么?NO,抽象工厂模式并不是为了解决简单工厂模式的缺陷而活着,它是因为有新的使命而诞生. 一个简单的例

[Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式

注:关乎对象的创建方式的设计模式就是"创建型设计模式"(creational design pattern) 1.1 抽象工厂模式 "抽象工厂模式"(Abstract Factory Pattern)用来创建复杂的对象,这种对象由许多小对象组成,而这些小对象都属于某个特定的"系列"(family). 比如说,在GUI 系统里可以设计"抽象控件工厂"(abstract widget factory),并设计三个"具体子

23种设计模式[3]:抽象工厂模式

一.简单工厂模式(静态工厂方法,不属于23种GOF设计模式之一) 定义:定义一个用于创建产品对象的方法,由该工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 类型:创建类模式 public interface SmsService { void sendSms(); } public class MontnetsService implements SmsService { @Override public void sendSms() { Syste

JAVA常用设计模式(一、抽象工厂模式)

抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类.每个生成的工厂都能按照工厂模式提供对象. 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 主要解决:主要解决接口选择的问题. 何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一

一天一个设计模式——Abstract Factory抽象工厂模式

一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂方法模式中,抽象工厂使用抽象的零件组装成抽象的产品.即使用包含特定的方法接口零件,将零件组装成抽象产品. 二.模式类图: 上面的类图中包含两个包:包含抽象工厂,抽象零件,抽象产品的类所在的包以及具体工厂实现类的包. 三.代码示例 1.Item类: package com.designpattern.