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

(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. 【Restore IP Addresses 】cpp

    题目: Given a string containing only digits, restore it by returning all possible valid IP address com ...

  2. 【Swap Nodes in Pairs】cpp

    题目: Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1-> ...

  3. Android onConfigurationChanged用法(规避横竖屏切换导致的重新调用onCreate方法)

    onConfigurationChanged的目的是为了规避横竖屏切换干掉activity而重新调用onCreate方法的问题:有的时候,我们希望重新进入OnCreate生命周期,此时可以调用onSa ...

  4. Postgres 将查询结果同时插入数据表

    INSERT INTO table [ ( column [, ...] ) ] { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ... ...

  5. 【SDOI2009】HH的项链 线段树

    题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...

  6. LeetCode661图片平滑器

    题目描述:包含整数的二维矩阵 M 表示一个图片的灰度.你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个, ...

  7. mouseClicked、mousePressed、mouseReleased 的区别

    2014年03月16日 21:12:10 xiaobineric 阅读数 9681 标签: 鼠标 事件   关于这3个事件,一直搞不清楚甚至混淆,也已经有一些人说过,但觉得不够明白,最近看了一段教材的 ...

  8. 为不是函数的对象 'dbo.xxxx' 提供了参数。如果这些参数要作为表提示,则需要使用 WITH 关键字

    为不是函数的对象 'dbo.xxxxxx' 提供了参数.如果这些参数要作为表提示,则需要使用 WITH 关键字 犯错误原因:给视图加条件了.. 用.where(a=>a.ID=xxx.ID);

  9. BZOJ 1877:[SDOI2009]晨跑(最小费用最大流)

    晨跑DescriptionElaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个 ...

  10. 【Luogu】P2173网络(LCT)

    题目链接 这次坑我的是与或的结合顺序…… 开十个LCT记录一下即可.以上. #include<cstdio> #include<cstring> #include<cst ...