一、概述

1.抽象工厂:当情况是需要产生一系列产品,若需更换产品,则要求一系列产品一起换,且要控制一系列产品的产生过程,此时可考虑抽象工厂模式。例:小明装修屋子,把电视、冰箱都替换掉,他这次需要把电视、冰箱换成三星的,下次装修可能要换成海尔的。此时可设计抽象类Telveison及Fridge负责产生产品,抽象工厂AbstractFactory负责产生一系列产品

PS:抽象工厂与普通工厂各自的优缺点:

(1)普通工厂容易在产品维度进行扩展,但产生系列产品时不方便,且易造成工厂类泛滥

(2)抽象工厂增加新产品时,要修改AbstractFactory等多处地方

二、类结构

1.Televison.java

2.Fridge.java

3.SamsumgTelevison.java

4.SamsungFridge.java

5.HaierTevevison.java

6.HaierFridge.java

7.AbstractFactory.java

8.SamsungFactory.java

9.HaierFactory.java

三、代码

1.Televison.java

public abstract class Televison {

	abstract void show();
}

  

2.Fridge.java

public abstract class Fridge {

	abstract void cool();
}

  

3.SamsumgTelevison.java

public class SamsungTelevison extends Televison {

	@Override
public void show(){
System.out.println("SamsungTelevison showing...........");
}
}

  

4.SamsungFridge.java

public class SamsungFridge extends Fridge {

	@Override
void cool() {
System.out.println("SamsungFridge cooling");
} }

  

5.HaierTevevison.java

public class HaierTelevison extends Televison {

	@Override
void show() {
System.out.println("海尔电视 showinng...........");
} }

  

6.HaierFridge.java

public class HaierFridge extends Fridge {

	@Override
void cool() {
System.out.println("海尔冰箱冷却中............");
} }

  

7.AbstractFactory.java

public abstract class AbstractFactory {
abstract Televison createTelevison();
abstract Fridge createFridge();
}

  

8.SamsungFactory.java

public class SamsungFactory extends AbstractFactory {

	@Override
Televison createTelevison() {
return new SamsungTelevison();
} @Override
Fridge createFridge() {
return new SamsungFridge();
} }

  

9.HaierFactory.java

public class HaierFactory extends AbstractFactory {

	@Override
Televison createTelevison() {
return new HaierTelevison();
} @Override
Fridge createFridge() {
return new HaierFridge();
} }

  

10.Test.java

public class Test {

	@org.junit.Test
public void test(){
AbstractFactory factory = new SamsungFactory();
Televison tv = factory.createTelevison();
Fridge fridge = factory.createFridge();
tv.show();
fridge.cool(); System.out.println("======================================="); factory = new HaierFactory();
tv = factory.createTelevison();
fridge = factory.createFridge();
tv.show();
fridge.cool();
}
}

  

运行结果:

Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式的更多相关文章

  1. C#设计模式学习笔记:(3)抽象工厂模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7596897.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...

  2. Java-马士兵设计模式学习笔记-总结

    <马士兵设计模式学习>学习了以下模式: 1.装饰者模式(例子:水管工,木工) 2.策略模式(例子:老师用职称比大小.学生用成绩比大小) 3.简单工厂模式(例子:VechileFactory ...

  3. Java设计模式学习笔记,二:工厂模式

    工厂模式,主要实现了创建者和调用者的分离. 分类:1.简单工厂模式:2.工厂方法模式:3.抽象工厂模式. 核心:实例化对象时,用工厂方法代替new操作. 一.简单工厂模式 也叫静态工厂模式,工厂类中实 ...

  4. C#设计模式学习笔记:(11)享元模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7792973.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第六个模式--享 ...

  5. C#设计模式学习笔记:(20)职责链模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8109100.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第八个模式--职 ...

  6. C#设计模式学习笔记:(17)中介者模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7966240.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第五个模式--中 ...

  7. Java-马士兵设计模式学习笔记-工厂模式-简单工厂

    一.概述 1.目标:要控制任意类型交通工具的生产模式 2.目标有两层意思(1)任意类型 (2)生产模式,所以对应的,要这两个层面上抽象(Movable,VehicleFactory),利用接口,实现多 ...

  8. Java-马士兵设计模式学习笔记-工厂模式-用Jdom模拟Spring

    一.概述 1.目标:模拟Spring的Ioc 2.用到的知识点:利用jdom的xpath读取xml文件,反射 二.有如下文件: 1.applicationContext.xml <?xml ve ...

  9. Java-马士兵设计模式学习笔记-工厂模式-模拟Spring读取Properties文件

    一.目标:读取properties文件,获得类名来生成对象 二.类 1.Movable.java public interface Movable { void run(); } 2.Car.java ...

随机推荐

  1. 14 Python 装饰器

    装饰器 装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数.让我们从简单的开始,直到能写出实用的装饰器. def outer(some_func): def inner(): print ...

  2. Mybatis_总结_03_用_动态SQL

    一.前言 MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还 ...

  3. model1 就是jsp+javabean

  4. 20165210 Java第三周学习总结

    20165210 Java第三周学习总结 教材学习内容总结 - 第四章学习总结 编程语言的几个发展阶段: 面向机器语言 面向过程语言 面向对象语言 类: 类声明: class People { ... ...

  5. MonoBehavior lifecycle

    awake 只调用一次, awake在所有obj都初始化之后被调用. 用途: 初始化游戏状态 设置脚本间的引用 ### ExecuteInEditMode 编辑模式下 ``` 这个模式下,脚本编译,会 ...

  6. stl_relops.h

    stl_relops.h // Filename: stl_relops.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http ...

  7. vue-router导航守卫

    导航守卫 译者注 “导航”表示路由正在发生改变. 正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航.有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件 ...

  8. flask之全局对象

    from flask import current_app, g g is a special object that is unique for each request. It is used t ...

  9. Tex 括号的反思

    在Tex中,左双引号是“,右双引号是”,输入一篇包含双引号的文章,你的任务是把它转换成Tex的格式. 样例输入: “To be or not to be,”quoth the Bard,"t ...

  10. python第十一天-----补:缓存操作

    memcached,首先下载python-memcached模块,在cmd中执行pip install python-memcached即可 memcached比较简单,默认情况仅支持简单的kv存储, ...