定义

抽象工厂类为创建一组相关和相互依赖的对象提供一组接口,而无需指定一个具体的类。

​ 这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。这里强调一下,工厂方法包括:简单工厂模式,和工厂方法模式等一些系列的工厂方法模式的变形。

案例

​ 现在有两个产品,一个是手机,一个是电脑。手机和电脑都是不同的生产商生产的。我们要实现一个工厂管理系统,记录华为和苹果着两家工厂生产的手机和电脑信息。

​ 已知,华为和苹果都有自己的工厂,华为的叫做华为工厂,苹果的叫做苹果工厂。华为工厂生产华为手机和华为电脑。苹果工厂生产苹果手机和苹果电脑。用抽象工厂模式实现改系统,他的设计图如 图一:

图一

代码如下

Factory类:

/**
* @InterfaceName Factory
* @Description 抽象工厂
* @Author ouyangkang
* @Date 2019-01-19 11:25
**/
public interface Factory {
/**
* @Author ouyangkang
* @Description 生产手机
* @Date 11:25 2019/1/19
* @param
* @return com.设计模式.factory.abstractfactory.Phone
**/
Phone createPhone();
/**
* @Author ouyangkang
* @Description 生产电脑
* @Date 11:26 2019/1/19
* @param
* @return com.设计模式.factory.abstractfactory.Computer
**/
Computer createComputer();
}

IphoneFactory类

/**
* @ClassName IphoneFactory
* @Description 苹果厂商之生产苹果的产品
* @Author ouyangkang
* @Date 2019-01-19 11:36
**/
public class IphoneFactory implements Factory{
@Override
public Phone createPhone() {
return new Iphone();
} @Override
public Computer createComputer() {
return new IphoneComputer();
}
}

HuaWeiFactory类

/**
* @ClassName HuaWeiFactory
* @Description TODO
* @Author ouyangkang
* @Date 2019-01-19 11:37
**/
public class HuaWeiFactory implements Factory {
@Override
public Phone createPhone() {
return new HuaWeiIphone();
} @Override
public Computer createComputer() {
return new HuaWeiComputer();
}
}

Phone类

/**
* @InterfaceName Phone
* @Description 手机接口
* @Author ouyangkang
* @Date 2019-01-19 11:21
**/
public interface Phone {
/**
* @Author ouyangkang
* @Description 手机生产商
* @Date 11:23 2019/1/19
* @param
* @return void
**/
void name();
/**
* @Author ouyangkang
* @Description 通信功能
* @Date 11:22 2019/1/19
* @param
* @return void
**/
void communication();
}

Iphone类

/**
* @ClassName Iphone
* @Description TODO
* @Author ouyangkang
* @Date 2019-01-19 11:27
**/
public class Iphone implements Phone {
@Override
public void name() {
System.out.println("苹果手机");
} @Override
public void communication() {
System.out.println("用苹果手机进行通信");
}
}

HuaWeiPhone类


/**
* @ClassName HuaWeiPhone
* @Description TODO
* @Author ouyangkang
* @Date 2019-01-19 11:33
**/
public class HuaWeiPhone implements Phone {
@Override
public void name() {
System.out.println("华为手机");
} @Override
public void communication() {
System.out.println("用华为手机进行通信");
}
}

Computer类

/**
* @InterfaceName Computer
* @Description 电脑
* @Author ouyangkang
* @Date 2019-01-19 11:23
**/
public interface Computer {
/**
* @Author ouyangkang
* @Description 电脑生产商
* @Date 11:24 2019/1/19
* @param
* @return void
**/
void name(); /**
* @Author ouyangkang
* @Description 上网
* @Date 11:24 2019/1/19
* @param
* @return void
**/
void surf();
}

HuaWeiComputer类和IPhoneComputer类和上面HuaWeiIphone和Iphone类似代码就不重复了。

Client类

public class Client {
public static void main(String[] args) {
//苹果厂商
Factory iphoneFactory = new IphoneFactory(); Computer iphoneFactoryComputer = iphoneFactory.createComputer();
iphoneFactoryComputer.name();
iphoneFactoryComputer.surf(); System.out.println("--------------------------");
Phone phone = iphoneFactory.createPhone();
phone.name();
phone.communication(); System.out.println("--------------------------"); // 华为厂商
Factory huaWeiFactory = new HuaWeiFactory(); Computer huaWeiFactoryComputer = huaWeiFactory.createComputer();
huaWeiFactoryComputer.surf();
huaWeiFactoryComputer.name(); System.out.println("--------------------------"); Phone huaWeiPhone = huaWeiFactory.createPhone();
huaWeiPhone.communication();
huaWeiPhone.name();
}
}

运行得到结果

苹果电脑
用苹果电脑上网
--------------------------
苹果手机
用苹果手机进行通信
--------------------------
用华为电脑上网
华为电脑
--------------------------
用华为手机进行通信
华为手机

总结

​ 上面得简单UML类图我用Visual Paradigm 15.2划了好久,想起了学校外教教我们画这个得时候,后悔当初学得不好,现在只能自己慢慢摸索。

​ 抽象工厂从定义上是很好理解的,为创建一组相关得或者相互依赖得对象提供一个接口,无需指定一个具体得类。一开始自己对于抽象工厂和工厂方法模式总是混淆,但是如果咬文嚼字得看这个两个设计模式得定义得话,然后看代码还是很好区别得。如果你看到一个Factory只有定义一个实例化子类得接口,那么你就可以认为它是工厂方法模式,如果你看到一个Factory中定义了多个实例化子类的不同接口的话,那么他就是抽象工厂方法。

Java设计模式从精通到入门五 抽象工厂方法模式的更多相关文章

  1. Android设计模式——抽象工厂方法模式

    1.抽象工厂方法模式:为了创建一组或相互依赖的对象提供一个接口,而不需要指定它们是具体类……无语 2.找个代码看看: 抽象工厂类<成员为接口> /** * 抽象工厂 * */ public ...

  2. Java设计模式从精通到入门四 工厂方法模式

    工厂方法模式 属于23中设计模式中创建型类型. 核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类. 来源 ​ 设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟 ...

  3. java23种设计模式之九: 抽象工厂方法模式

    一.抽象工厂定义 上一讲我们说了一下工厂方法,那么我们如何对工厂进行抽象. 因为工厂是生产产品的,现在我们需要工厂抽象,只生产抽象产品,不生产具体的产品,这同时也体现了java的多态. 现在有2个抽象 ...

  4. 抽象工厂方法模式(Abstract Factory Pattern)

    Provide an interface for creating families of related or dependent objects without specifying their ...

  5. Java设计模式从精通到入门一 责任链模式

    ​ 一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了.于是有了想要记录下设计模式的笔记.打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一 ...

  6. Java设计模式从精通到入门二 装饰器模式

    介绍 ​ 我尽量用最少的语言解释总结: ​ Java23种设计模式之一,属于结构型模式,允许向一个现有的对象添加新的功能,不改变其结构. 应用实例: ​ 给英雄联盟种的射手,添加不同的装备.先装备攻速 ...

  7. Java设计模式从精通到入门三 策略模式

    介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于行为型模式.一个类的行为或者算法可以在运行时更改,策略对象改变context对象执行算法. 应用实例: ​ 以周瑜赔了夫人又折兵的例 ...

  8. Java设计模式之工厂模式(简单工厂模式+工厂方法模式)

    摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...

  9. Java设计模式系列-工厂方法模式

    原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...

随机推荐

  1. nginx实践(二)之静态资源web服务(浏览器缓存场景)

    配置语法-expires

  2. NHibernate 如何在并行线程下,使用session

    第一,你要知道,并行线程会有一个蛋疼的地方.他不会每次执行都给你去开一个线程. 我一开始以为每次执行都会去开一个新的线程.... list.AsParallel().ForAll(memberInfo ...

  3. Android源码分析二 硬件抽象层(HAL)

    一 什么是HAL HAL 可定义一个标准接口以供硬件供应商实现,这可让 Android 忽略较低级别的驱动程序实现.借助 HAL,您可以顺利实现相关功能,而不会影响或更改更高级别的系统.HAL 实现会 ...

  4. 《剑指offer》 数值的整数次方

    本题来自<剑指offer> 数值的整数次方 题目: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路: 代码从三个方面处 ...

  5. laravel 表单方法伪造

    有时候,我们可能需要手动定义发送表单数据所使用的 HTTP 请求方式,而 HTML 表单仅支持 GET 和 POST 两种方式,如果要使用其他的方式,则需要自己来定义实现. HTTP 请求方式概述 最 ...

  6. 关于JDBC的总结

    1. Spring JDBC子框架是什么 答:就是一个Spring框架内置的持久层框架.既然是一个持久层框架,作用就是对数据库增删改查!! 2. SpringJDBC是使用声明类操作数据库的? 答:J ...

  7. Distance

    1191: Distance 时间限制: 1 Sec  内存限制: 32 MB 题目描述 There is a battle field. It is a square with the side l ...

  8. AI学习吧-Redis操作-事务、订阅

    事务 #首先启动redis服务端和客户端:#关于事务,数据库中的事务指的是逻辑上的一组操作,这组操作要么都执行成功要么不执行成功,出现异常会回滚到初始状态. 在代码中加入xxx,代码报错的话,不会执行 ...

  9. lsattr chattr 文件安全设置

    [root@test_android_client_download xianlaigames]# lsattr -------------e- ./jilinmj.apk[root@test_and ...

  10. linux dig 命令使用方法

    ref:https://www.imooc.com/article/26971?block_id=tuijian_wz dig 命令主要用来从 DNS 域名服务器查询主机地址信息. 查询单个域名的 D ...