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

(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. Java中BigInteger类型

    BigInteger是java.math包提供的处理大整数类型,实现了大整数的存储,四则运算,判断素数的方法,求幂,求模,求逆元,求最大公约数等方法.本文主要分析下BigInteger对于大整数的存储 ...

  2. laravel5.2总结--序列化

    序列化 构建Json格式的API接口时,经常需要转换 '模型' 和 '关联关系' 为数组或者JSON. 1>转换模型为数组:   $user = App\User::with('roles')- ...

  3. Tensorflow打造聊天机器人

    Tensorflow聊天机器人 聊天机器人也叫做对话系统,是一个热门领域.微软.facebook.苹果.google.微信.slack都在上面做了大的投入,这是一波新的试图改变人和服务交流的创业浪潮. ...

  4. 【Word Break II】cpp

    题目: Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where e ...

  5. IOS开发学习笔记033-UIScrollView

    1.滚动显示图片 如果图片过大,则需要滚动显示,这是需要用到类UIScrollView,可是实现控件的水平和垂直滚动. 可用三步实现:1 设置UIScrollView,2 设置UIImageView, ...

  6. Wordpress Uncaught TypeError: b(...).not(...).filter(...).mediaelementplayer is not a function

    Wordpress 插件页面报错如下图: 原因及解决方法: 引入了两次 jquery.js 或 jquery.js 定义的变量导致报错,删除在插件页面自己引入的 jquery,js 即可解决报错. 大 ...

  7. 【转】netstat 查看端口占用情况

    netstat用来查看系统当前系统网络状态信息,包括端口,连接情况等,常用方式如下: netstat -atunlp,各参数含义如下: -t : 指明显示TCP端口 -u : 指明显示UDP端口 -l ...

  8. linux VIM编辑器常用指令

    一般模式 查看文本-移动光标 [Ctrl] + [f] 屏幕『向前』移动一页 [Ctrl] + [b]  屏幕『向后』移动一页  n<space> 按下数字后再按空格键,光标会向右移动这一 ...

  9. 理解点击屏幕的事件响应--->对- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法的理解

    要理解这两个方法.先了解一下用户触摸屏幕后的事件传递过程. 当用户点击屏幕后,UIApplication 先响应事件,然后传递给UIWindow.如果window可以响应.就开始遍历window的su ...

  10. codeforces gym 100553I

    codeforces gym 100553I solution 令a[i]表示位置i的船的编号 研究可以发现,应是从中间开始,往两边跳.... 于是就是一个点往两边的最长下降子序列之和减一 魔改树状数 ...