定义

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

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

案例

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

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

图一

代码如下

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. Logcat命令详情

    logcat是什么? Logcat 是一个命令行工具,用于转储系统消息日志,其中包括设备引发错误时的堆叠追踪以及从您的应用使用 Log类编写的消息. 格式:[adb] logcat [<opti ...

  2. vue.js 入门学习

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. matalb 产生信号源 AM调制解调 FM调制解调

    %%%%%%%%%%%%%%%%%%%%%%%%%%% %AM调制解调系统 %%%%%%%%%%%%%%%%%%%%%%%%%%% clear; clf; close all Fs=800000;%采 ...

  4. 【python】python为何多线程无法切换

    写了一个kafka传输消息,celery发布任务的脚本. 有四个线程,分别读取不同的kafka队列信息 问题是,只有第一个线程会启动,剩下的三个线程连start都运行不了. 而且这个问题不是一开始就发 ...

  5. 【sqli-labs】Less11~Less16

    学习sqli-labs的笔记,前面的笔记内容比较详细.后面的只记录关键点了. Less11: POST注入, 有回显,有错误提示 从11题起是POST注入,发现有两个输入框.用firefox的F12查 ...

  6. Java中Super和final关键字以及异常类

    1.final类不能有子类,也就谈不上继承的说法,如果用final修饰成员变量或者局部变量,那成了常量需要制定常量的值. 2.对象的上转型对象,上转型对象不能操作子类新增的成员变量,不能调用子类新增的 ...

  7. PyCharm设置字体风格

    设置字体风格:File—Setting—Editor-Color Scheme-Color Scheme Font-把Scheme设置为:WarmNeon

  8. python发送邮件(在邮件中显示HTMLTestRunner生成的报告)

    import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart f ...

  9. 备份还原数据数据库(固定IP版)

    1.新建data文件夹,用于存放备份数据 2.新建db文件夹,用于存放初建数据库为脚本 3.首次使用双击export.bat进行备份数据库: 4.以后每次使用双击setup.bat进行还原数据库: 备 ...

  10. Android取得系统时间

    Time t = new Time();//实例化Time类 t.setToNow();//取得当前的系统时间 int month = t.month;//获取月 int year = t.year; ...