文档章节

Java设计模式之抽象工厂模式

断桥残雪断桥残雪
 断桥残雪断桥残雪
发布于 2015/08/09 14:51
字数 1046
阅读 276
收藏 9

抽象工厂模式特点

抽象工厂模式与工厂模式最大的区别是每个单独的产品是一个工厂模式,而多个不同产品交互则是抽象工厂模式,抽象工厂模式通常要运用工厂模式的方法。通常,工厂模式的所有产品的创建都放在这个工厂里面,如果产品有所变更,则需要修改该工厂方法,违反了设计模式的开闭原则——对扩展开放,对修改关闭。而抽象工厂模式则认为当需要创建一个新的产品时,也创建一个新的工厂即可,不需要修改任何之前已有的代码。

抽象工厂案例图

从上图可以看出,如果要开发一个搜索的功能,而搜索功能又分为图片搜索和新闻搜索,图片搜索又可以再开发新功能,如风景图片搜索、明星图片搜索、动漫图片搜索;同样新闻搜索又可以再开发新功能,如文化新闻搜索、科技新闻搜索、经济新闻搜索。对于这样的一个强大的功能,可以使用抽象工厂模式,例如可以建一个搜索工厂,用于创建图片搜索和新闻搜索的接口,然后再定义两个小工厂,图片工厂和新闻工厂,实现搜索工厂这个接口,并且可以创建具体的搜索功能实例。

案例的具体代码实现

首先定义一个可搜索的接口,所有的被搜索对象均要实现这个接口,才可以被搜索到:


package com.factory.abstractFactory;

public interface Searchable {
	public void get();
}



定义搜索工厂接口,内部定义search()方法,任何一个子工厂都要实现该方法:



package com.factory.abstractFactory;

public interface SearchFactory {
	
	public Searchable search();
}


图片搜索工厂

定义图片搜索的三个功能:



package com.factory.abstractFactory;

public class ViewPic implements Searchable {

	@Override
	public void get() {
		System.out.println("风景图片搜索");
	}
}



package com.factory.abstractFactory;

public class StarPic implements Searchable {

	@Override
	public void get() {
		System.out.println("明星图片搜索");
	}
}



package com.factory.abstractFactory;

public class AnimationPic implements Searchable {

	@Override
	public void get() {
		System.out.println("动漫图片搜索");
	}
}



分别定义三个图片搜索工厂:



package com.factory.abstractFactory;

public class ViewPicFactory implements SearchFactory {

	@Override
	public Searchable search() {
		return new ViewPic();
	}
}



package com.factory.abstractFactory;

public class StarPicFactory implements SearchFactory {

	@Override
	public Searchable search() {
		return new StarPic();
	}
}



package com.factory.abstractFactory;

public class AnimationPicFactory implements SearchFactory{

	@Override
	public Searchable search() {
		return new AnimationPic();
	}
}



新闻搜索工厂

定义新闻搜索的三个功能:


package com.factory.abstractFactory;

public class CultureNews implements Searchable{

	@Override
	public void get() {
		System.out.println("文化新闻搜索");		
	}
}



package com.factory.abstractFactory;

public class TechNews implements Searchable {

	@Override
	public void get() {
		System.out.println("科技新闻搜索");
	}
}



package com.factory.abstractFactory;

public class EconomicNews implements Searchable{

	@Override
	public void get() {
		System.out.println("经济新闻搜索");
	}
}



分别定义三个新闻搜索工厂:



package com.factory.abstractFactory;

public class CultureNewsFactory implements SearchFactory {

	@Override
	public Searchable search() {
		return new CultureNews();
	}
}



package com.factory.abstractFactory;

public class TechNewsFactory implements SearchFactory {

	@Override
	public Searchable search() {
		return new TechNews();
	}
}



package com.factory.abstractFactory;

public class EconomicNewsFactory implements SearchFactory {

	@Override
	public Searchable search() {
		return new EconomicNews();
	}
}



测试代码


package com.factory.abstractFactory;

public class Test {

	public static void main(String[] args) {
		//搜索风景图片
		SearchFactory viewPicFactory = new ViewPicFactory();
		Searchable search1 = viewPicFactory.search();
		search1.get();
		
		//搜索明星图片
		SearchFactory starPicFactory = new StarPicFactory();
		Searchable search2 = starPicFactory.search();
		search2.get();
		
		//搜索动漫图片
		SearchFactory animationPicFactory = new AnimationPicFactory();
		Searchable search3 = animationPicFactory.search();
		search3.get();
		
		//搜索科技新闻
		SearchFactory techNewsFactory = new TechNewsFactory();
		Searchable search4 = techNewsFactory.search();
		search4.get();
		
		//搜索经济新闻
		SearchFactory economicNewsFactory = new EconomicNewsFactory();
		Searchable search5 = economicNewsFactory.search();
		search5.get();
		
		//搜索文化新闻
		SearchFactory cultureNewsFactory = new CultureNewsFactory();
		Searchable search6 = cultureNewsFactory.search();
		search6.get();
	}
}



测试结果:



风景图片搜索
明星图片搜索
动漫图片搜索
科技新闻搜索
经济新闻搜索
文化新闻搜索






抽象工厂模式的适用性

上面的例子可以再次扩展,只用添加做一个功能实现类,并且实现Searchable接口,同时创建一个产品工厂即可,还可以进行产品之间功能的耦合。抽象工厂模式可以适用于一个系统独立于产品的创建组合和表示,或者只想提供一个产品类库的接口,不想提供实现的时候。


© 著作权归作者所有

断桥残雪断桥残雪
粉丝 53
博文 139
码字总数 94909
作品 0
广州
程序员
私信 提问
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
218
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
277
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
293
0
设计模式: Java中的工厂设计模式

原文链接 https://github.com/shellhub/blog/issues/22 前言 工厂设计模式(Factory Design Pattern)属于创建模式之一,工厂设计模式在JDK,Spring,Stuts被广泛使用 当一个类或者接口有多个子类...

shellhub
2018/08/22
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
285
2

没有更多内容

加载失败,请刷新页面

加载更多

为构建社交关系链手淘都做了啥?

作者|王卫(泓冰) 出品|阿里巴巴新零售淘系技术部 01、淘宝社交关系推荐的背景 1、互联网下半场到来:互联网的下半场,人口红利消失,各大平台需要对用户做精细化运营,用户的增长和留存是每一...

阿里云官方博客
9分钟前
3
0
Iaas/Paas/Saas有何区别,一个故事告诉你

云计算有三种服务模式,IaaS,PaaS和SaaS。单从英文全称去理解,他们分别是“基础设施即服务”“平台即服务”和“软件即服务”。 这样翻译过来可不好理解,但是我们可以举个例子。现在我们就以...

JEPaaS云平台
17分钟前
3
0
温度传感器怎么测好坏

  温度传感器也就是负温度系数热敏电阻,温度越高,电阻越小,测量时先看其阻值能不能根据温度的变化而变,再看其变化的阻值是不是在标定的范围之内。   有以下四种方法;   1、若是有...

仙溪
17分钟前
3
0
zk中ZooKeeperServer解析

内部类 ChangeRecord 处理PrepRP和FinalRP之间的信息 static class ChangeRecord { ChangeRecord(long zxid, String path, StatPersisted stat, int childCount, List<ACL> acl) {......

writeademo
27分钟前
3
0
LNMP---安装worrdpress、discuz,域名重定向,用户认证,nginx访问日志

4.34 安装wordpress 4.35 安装discuz 4.36 域名重定向 4.37 用户认证 4.38 nginx访问日志 一、安装wordpress 创建博客: 添加一个博客的虚拟主机 blog.tobe.com.conf 做如下更改 安装博客wor...

tobej
29分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部