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

(1)定义产品接口

/**
* 第一种系列的产品
* @author Administrator
*
*/
interface IProduct1{
public void show();
} /**
* 第二种系列的 产品
* @author Administrator
*
*/
interface IProduct2{
public void show();
}

(2)产品的具体实现类

/**
* 产品的具体实现类1
* @author Administrator
*
*/
class Product1 implements IProduct1{
public void show()
{
System.out.println("product1");
}
} /**
* 产品的具体实现类2
* @author Administrator
*
*/
class Product2 implements IProduct2{
public void show(){
System.out.println("product2");
}
}

(3)定义工厂接口

/**
* 工厂接口
* @author Administrator
*
*/
interface IFactory {
public IProduct1 createProduct1();
public IProduct2 createProduct2();
}

(6)工厂的实现类

/**
* 工厂的实现类
* @author Administrator
*
*/
class Factory implements IFactory{
/**
* 创建第一种产品
*/
@Override
public Product1 createProduct1(){
return new Product1();
}
/**
* 创建第二种产品
*/
@Override
public Product2 createProduct2(){
return new Product2();
}
}

(7)模拟客户端的使用

/**
* 客户端的模拟类
* @author Administrator
*
*/
public class Client {
public static void main(String[] args){
//创建工厂
IFactory factory=new Factory();
//生产产品1
Product1 product1=(Product1) factory.createProduct1();
product1.show();
//生产产品2
Product2 product2=(Product2) factory.createProduct2();
product2.show();
}
}

可以使用同一个工厂创建多个相关或者相互依赖的对象,不需要具体指明要生产对象的类,只需要说明部分特性(一部分特性由生产对象的工厂来决定)

完整代码

package com.songyan.designpattern;

/**
* 第一种系列的产品
* @author Administrator
*
*/
interface IProduct1{
public void show();
} /**
* 第二种系列的 产品
* @author Administrator
*
*/
interface IProduct2{
public void show();
} /**
* 产品的具体实现类1
* @author Administrator
*
*/
class Product1 implements IProduct1{
public void show()
{
System.out.println("product1");
}
} /**
* 产品的具体实现类2
* @author Administrator
*
*/
class Product2 implements IProduct2{
public void show(){
System.out.println("product2");
}
} /**
* 工厂接口
* @author Administrator
*
*/
interface IFactory {
public IProduct1 createProduct1();
public IProduct2 createProduct2();
} /**
* 工厂的实现类
* @author Administrator
*
*/
class Factory implements IFactory{
/**
* 创建第一种产品
*/
@Override
public Product1 createProduct1(){
return new Product1();
}
/**
* 创建第二种产品
*/
@Override
public Product2 createProduct2(){
return new Product2();
}
} /**
* 客户端的模拟类
* @author Administrator
*
*/
public class Client {
public static void main(String[] args){
//创建工厂
IFactory factory=new Factory();
//生产产品1
Product1 product1=(Product1) factory.createProduct1();
product1.show();
//生产产品2
Product2 product2=(Product2) factory.createProduct2();
product2.show();
}
}

AbstractFactory的更多相关文章

  1. C++设计模式-AbstractFactory抽象工厂模式

    AbstractFactory 要创建一组相关或者相互依赖的对象 作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. UML结构图: 抽象基类: 1)AbstractProdu ...

  2. factory工厂模式之抽象工厂AbstractFactory

    * 抽象工厂: 意图在于创建一系列互相关联或互相依赖的对象. * 每个工厂都会创建一个或多个一系列的产品 * 适用于:产品不会变动,开始时所有产品都创建好,然后根据分类获取想要的 某一类产品(很像sp ...

  3. 设计模式系列 1——StaticFactory(静态工厂),AbstractFactory(抽象工厂)

    本文出自 代码大湿 代码大湿 本系列持续更新,敬请关注. 1 静态工厂 静态工厂介绍: 静态工厂模式可以实现接口封装隔离的原则.在客户端只知接口而不知实现的时候可以使用静态工厂模式. 源码请点击我 角 ...

  4. AbstractFactory 模式

    ///////////////////////Product.h////////////// #ifndef _PRODUCT_H_ #define _PRODUCT_H_ class Abstrac ...

  5. 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式

    桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...

  6. Factory and AbstractFactory ——抽象与具体的分离

    Factory and AbstractFactory——抽象与具体的分离 面向对象标准关注于抽取一系列事物的共同行为,组建一个基类.行为再划分成两类: 1:现在及以后不太可能会变化的行为. 2:以后 ...

  7. 抽象工厂(AbstractFactory)模式-创建型模式

    1.new 的问题 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对具体实例的变化 怎么理解上面这句话呢? 可以这样理解:我 ...

  8. 设计模式(4)--AbstractFactory(抽象工厂模式)--创建型

    1.模式定义: 抽象工厂是应对产品族概念的,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类 2.模式特点: 抽象工厂模式为创建一组对象提供了一种解决方案.与工厂方法模式相比,抽象工 ...

  9. C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】

    一.引言     写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了 ...

  10. C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】

    一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简 ...

随机推荐

  1. python-day4-内置函数2

    摘要:python中有好多可用性特别强的内置函数,熟练掌握对于以后的编程过程中有很大的帮助~~~~ callable函数.chr函数与ord函数.random函数.compile函数.evec与eva ...

  2. Java求职实战之继承和多态

    1.final修饰变量时,是引用不能变,还是引用的对象不能变? 是指引用变量不能变,引用对象的内容可以变. 2.==和equals有什么区别? 网上搜索一下,发现很多人解释的都比较清楚了.自己简单概括 ...

  3. LAMP总四部分

    第一部分 1. 安装mysqlcd /usr/local/src/ 免安装编译二进制的包wget http://syslab.comsenz.com/downloads/linux/mysql-5.1 ...

  4. 【bzoj4896】[Thu Summer Camp2016]补退选 Trie树+STL-vector

    题目描述 X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每次选课一共分为三个阶段:预选,正选,补退选:其中"补退选"阶段最 ...

  5. ZigBee学习四 无线+UART通信

    ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique messag ...

  6. Cmake——CMake+SVN或Hg生成版本号

    CMake+SVN或Hg生成版本号 原来的CMake需要用shell脚本生成SVN版本号,再作为cmake参数传入.CMake调用脚本示例: #!/bin/sh # cmake.sh ServerCo ...

  7. python知识集合

    1.list list是一种有序的集合 例子:classmates = ['Michael', 'Bob', 'Tracy']; 方法:1. len len(classmates) //3 2.app ...

  8. bzoj 3704 昊昊的机油之GRST 贪心dp,思维

    昊昊的机油之GRST Time Limit: 10 Sec  Memory Limit: 1024 MBSubmit: 80  Solved: 33[Submit][Status][Discuss] ...

  9. JS 改变鼠标样式

    此片记录如何改变鼠标样式: document.body.style.cursor = "url(resource/pic/icons/magnifier3.cur) 12 12,crossh ...

  10. mac 应用程序安装目录

    java 安装目录 :/Library/Java/JavaVirtualMachines/jdk1.8.0_<more numbers>.jdk/Contents/Home maven 安 ...