抽象工厂模式:提供一个创建一系列的相关的或者依赖的对象的接口,无需指定它们的具体实现类,具体的时间分别在子类工厂中产生。

类似于工厂模式:隔离了具体类的生产实现,使得替换具体的工厂实现类很容易。包含有以下模块:

1.抽象产品接口:定义产品的接口,公共的暴露方法。便于实际的产品类实现。

2.具体的产品类:包含实际产品的类的逻辑处理:

3.抽象工厂接口:定义产生系列对象的接口

4.具体的工厂实现:实现抽象的接口工厂,返回具体的产品类的实现。

下面是具体的代码示例:

1.抽象的产品接口,定义了Car 和 IBreakFast

package factory.simple;

/**
* 抽象产品角色 交通工具接口
*
* @author lilin
*
*/
public interface Car { /**
* 上班函数
*/
void gotowork(); }
package factory.abstractfactory;

/**
* @author lilin
*
*/
public interface IBreakFast {
/**
* 吃早餐
*/
void eat();
}

2.定义具体的产品类的实现:

package factory.simple;

/**
* 具体产品角色,自行车
*
* @author lilin
*
*/
public class Bike implements Car {
@Override
public void gotowork() {
System.out.println("骑自行车去上班!");
} }
package factory.simple;

/**
* @author lilin
*
*/
public class Bus implements Car { @Override
public void gotowork() {
System.out.println("坐公交车去上班!");
} }
/**
*
*/
package factory.abstractfactory; /**
* @author lilin
*
*/
public class Milk implements IBreakFast { @Override
public void eat() {
System.out.println("喝牛奶!");
} }
/**
*
*/
package factory.abstractfactory; /**
* @author lilin
*
*/
public class Orange implements IBreakFast { @Override
public void eat() {
System.out.println("吃橘子!");
} }

3.定义好抽象的工厂接口,一系列的获取实例的接口方法:

/**
*
*/
package factory.abstractfactory; import factory.simple.Car; /**
* @author lilin
*
*/
public interface IAbstractFactory { /**
*
* @return
*/
Car getCar(); /**
*
*/
IBreakFast getBreakFast(); }

4.定义具体的工厂生产类,具体的产品实例返回。

/**
*
*/
package factory.abstractfactory; import factory.simple.Bike;
import factory.simple.Car; /**
* @author lilin
*
*/
public class LowPersonFactory implements IAbstractFactory { @Override
public Car getCar() {
return new Bike();
} @Override
public IBreakFast getBreakFast() {
return new Orange();
} }
/**
*
*/
package factory.abstractfactory; import factory.simple.Bus;
import factory.simple.Car; /**
* @author lilin
*
*/
public class HighPersonFactory implements IAbstractFactory { @Override
public Car getCar() {
return new Bus();
} @Override
public IBreakFast getBreakFast() {
return new Milk();
}
}

最后,通过testNG简单测试下,抽象工厂模式的实现:代码如下:

/**
*
*/
package factory.abstractfactory; import org.testng.annotations.Test; import factory.simple.Car; /**
* @author lilin
*
*/
public class AbstractFactoryTest { @Test
public void test() {
IAbstractFactory factory = new LowPersonFactory();
Car car = factory.getCar();
IBreakFast breakFast = factory.getBreakFast();
System.out.println("吃的早饭是:");
breakFast.eat();
System.out.println("上班交通工具是:");
car.gotowork(); IAbstractFactory factory2 = new HighPersonFactory();
car = factory2.getCar();
breakFast = factory2.getBreakFast();
System.out.println("吃的早饭是:");
breakFast.eat();
System.out.println("上班交通工具是:");
car.gotowork();
} }

这样使用过程城中,只要注入抽象的工厂接口,具体的产品的产生,会在实际的子类工厂类中产生,也可以随意的添加和修改实际子类工厂类,而不需要改变既有的代码设计。

抽象工厂方法:一般常常使用于一套程序,需要多套实现的场景之下。

java 抽象工厂模式简单实例的更多相关文章

  1. 设计模式(四)——Java抽象工厂模式

    抽象工厂模式 1 基本介绍 1) 抽象工厂模式:定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类 2) 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合. 3) ...

  2. Java抽象工厂模式

    Java抽象工厂模式 基本定义 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象 ...

  3. 抽象工厂模式&简单工厂模式

    抽象工厂模式 优点: 如IFactory factory=new AccessFactory(),在一个应用中只需要初始化一次,这就使得改变应用的时候变得非常容易:其次它让具体的创建实例过程与客户端分 ...

  4. Java 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是工厂方法模式的进一步抽象,其英文原话"Provide an interface for creating families ...

  5. PHP简单工厂模式、工厂方法模式和抽象工厂模式比较

    PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动 ...

  6. PHP简单工厂模式、工厂方法模式和抽象工厂模式

    PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动 ...

  7. iOS 抽象工厂模式

    iOS 抽象工厂模式 什么是抽象工厂模式 简单了解一下 按照惯例,我们先了解一下什么是抽象工厂模式.抽象工厂模式和工厂方法模式很相似,但是抽象工厂模式将抽象发挥的更加极致,是三种工厂模式中最抽象的一种 ...

  8. C#设计模式之:抽象工厂模式与反射

    抽象工厂模式[实例]:定义一个用于创建对象的接口,让子类决定实例化哪一个类 UML 代码class User{    private int _id;    public int Id { get = ...

  9. 抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式概述 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 抽象工厂抽象工厂,顾名思义,就是比工厂模式更抽象的工厂模式.在工厂模式中,一个具体工厂只负责生产一个具体产品 ...

随机推荐

  1. eas之日期控件

    日期选择框能进行日期和时间的编辑,默认情况下只能进行日期选择“××××年××月××日”,可通过调用用函数setTimeEnabled(boolean)来设置是否也有时间编辑.对日期进行编辑时,可手工直 ...

  2. 洛谷P1339 [USACO09OCT]热浪Heat Wave

    思路:裸SPFA过一遍(建议使用邻接链表存储),无向图,无向图,无向图,重要的事情要说三遍!!!蜜汁RE是什么鬼????第九个点数组开到20K,第十个点数组开到30K才AC.或许我代码写的有bug?( ...

  3. nyoj169-素数

    ms  |  内存限制:65535 KB 难度:1 描述 走进世博园某信息通信馆,参观者将获得前所未有的尖端互动体验,一场充满创想和喜悦的信息通信互动体验秀将以全新形式呈现,从观众踏入展馆的第一步起, ...

  4. [Cerc2007]robotic sort

    splay区间反转练手题 #include <iostream> #include <cstdio> #include <algorithm> using name ...

  5. lunix下的redis数据库操作——zset有序集合

    创建:(有序集合存在一个权重的概念) zadd zset 1 a 2 b 3 c 4 d 5 e 6 f 7 g # 输出: # 1) "a" # 2) "b" ...

  6. reset清除所有浏览器默认样式

    温馨提示 reset 的目的不是清除浏览器的默认样式, 这仅是部分工作. 清除和重置是紧密不可分的.reset 的目的不是让默认样式在所有浏览器下一致, 而是减少默认样式有可能带来的问题.reset ...

  7. /sys/power/state

    kernel/power/main.c中: /** * state - control system power state. * * show() returns what states are s ...

  8. 准备开源用javascript写Tomcat下的WebApp的项目

    原创文章,转载请注明. 这个想法由来已久.用javascript编写Tomcat下的WebApp.现现在也有alpha版本号的实现. 这种话,前端程序猿就能够像用Node.js那样,用javascri ...

  9. C++开发人脸性别识别教程(19)——界面美化

    在这篇博文中将完毕<C++开发人脸性别识别>的收尾工作.主要内容分为两部分:加入视频暂定功能.界面规范化. 一 视频暂停功能 严格来说这个视频暂定功能算是视频人脸性别识别的一个遗留问题,本 ...

  10. Maximal Rectangle [leetcode] 的三种思路

    第一种方法是利用DP.时间复杂度是 O(m * m * n) dp(i,j):矩阵中同一行以(i,j)结尾的所有为1的最长子串长度 代码例如以下: int maximalRectangle(vecto ...