设计模式系列 1——StaticFactory(静态工厂),AbstractFactory(抽象工厂)
本系列持续更新,敬请关注。
1 静态工厂
静态工厂介绍:
静态工厂模式可以实现接口封装隔离的原则。在客户端只知接口而不知实现的时候可以使用静态工厂模式。
角色:
Product:客户端需要使用的接口。
ConcreteProduct:Product的具体实现。
Factory:拥有静态方法的工厂类,返回ConcreteProduct实例。
Client:只知到Product。但是并不知道具体实现。
UML:

code:
package 设计模式.staticFactary;
/*
*2016年8月26日 上午10:15:22
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
public interface Product {
public void operation();
}
package 设计模式.staticFactary;
/*
*2016年8月26日 上午10:15:00
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
public class ConcreteProduct implements Product{
@Override
public void operation() {
System.out.println("我是具体产品中的实现方法");
}
}
package 设计模式.staticFactary;
/*
*2016年8月26日 上午10:47:01
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
public class Factory {
public static Product getProduct(){
return new ConcreteProduct();
}
}
package 设计模式.staticFactary;
/*
*2016年8月26日 上午10:48:05
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
public class Client {
public static void main(String[] args) {
Product product=Factory.getProduct();
product.operation();
}
}
2 AbstractFactory(抽象工厂)
AbstractFactory介绍:
AbstractFactory是为一系列相关的或者相互依赖的类创建接口,客户端不用关注他们的实现。相当如一个AbstractFactory的实现创建一个产品族。
AbstractFactory角色:
abstractProduct:抽象产品类。
ConcreteProduct:具体的产品实现。
abstractFactory:抽象工厂。
ConcreteFactory:具体的工厂实现。
UML:

场景:选用不同的方案来装机,主要是让cpu和主板配套。
code:
abstractProduct
package 设计模式.abstractFactory;
/*
*2016年9月2日 上午10:18:46
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
public interface CpuAPI {
public void calculate();
}
abstractProduct
package 设计模式.abstractFactory;
/*
*2016年9月2日 上午10:18:46
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
public interface MainBoardAPI {
void install();
}
ConcreteProduct
package 设计模式.abstractFactory;
/*
*2016年9月2日 上午10:20:38
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
public class IntellCpu implements CpuAPI{
Integer cpuPins;
public IntellCpu(Integer pins) {
cpuPins=pins;
}
@Override
public void calculate() {
System.out.println("Intell cpu 正在计算....."+"pins:"+cpuPins);
}
}
ConcreteProduct
package 设计模式.abstractFactory;
/*
*2016年9月2日 上午10:20:38
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
public class AMDCpu implements CpuAPI{
Integer cpuPins;
public AMDCpu(Integer pins) {
cpuPins=pins;
}
@Override
public void calculate() {
System.out.println("AMD cpu 正在计算....."+"pins:"+cpuPins);
}
}
package 设计模式.abstractFactory;
/*
*2016年9月2日 上午10:24:25
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
ConcreteProduct
//技嘉主板
public class GigaMainboard implements MainBoardAPI{
//插入cpu的接口pin数
Integer pins ;
public GigaMainboard(Integer pins) {
this.pins=pins;
}
@Override
public void install() {
System.out.println("技嘉主板正在安装.....pin数:"+pins);
}
}
ConcreteProduct
package 设计模式.abstractFactory;
/*
*2016年9月2日 上午10:24:25
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
//微星主板
public class MSIMainboard implements MainBoardAPI{
//插入cpu的接口pin数
Integer pins ;
public MSIMainboard(Integer pins) {
this.pins=pins;
}
@Override
public void install() {
System.out.println("微星主板正在安装.....pin数:"+pins);
}
}
AbstractFactory
package 设计模式.abstractFactory;
/*
*2016年9月2日 上午10:29:07
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
public interface AbstractFactory {
CpuAPI createCPU();
MainBoardAPI createMainBoardAPI();
}
ConcreteFactory
package 设计模式.abstractFactory;
/*
*2016年9月2日 上午10:31:01
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
public class ConcreteFactoryA implements AbstractFactory{
@Override
//intell cpu
public CpuAPI createCPU() {
return new IntellCpu(1156);
}
//技嘉主板
@Override
public MainBoardAPI createMainBoardAPI() {
return new GigaMainboard(1156);
}
}
ConcreteFactory
package 设计模式.abstractFactory;
/*
*2016年9月2日 上午10:31:01
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
public class ConcreteFactoryB implements AbstractFactory{
@Override
//AMD cpu
public CpuAPI createCPU() {
return new AMDCpu(939);
}
//微星主板
@Override
public MainBoardAPI createMainBoardAPI() {
return new MSIMainboard(939);
}
}
Client
package 设计模式.abstractFactory;
/*
*2016年9月2日 上午10:39:15
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
public class Engineer {
AbstractFactory schemal;
public Engineer(AbstractFactory schemal) {
this.schemal = schemal;
}
public void setSchemal(AbstractFactory schemal) {
this.schemal = schemal;
}
public void makeAndUseComputer(){
CpuAPI cpu=schemal.createCPU();
MainBoardAPI mainBoard=schemal.createMainBoardAPI();
cpu.calculate();
mainBoard.install();
}
}
package 设计模式.abstractFactory;
import static org.junit.Assert.*;
import java.nio.channels.NonWritableChannelException;
import javax.swing.border.AbstractBorder;
import org.junit.Test;
/*
*2016年9月2日 上午10:35:51
*@Author Pin-Wang
*@E-mail 1228935432@qq.com
*/
public class Client {
@Test
public void test() {
System.out.println("装机方案A");
//装机模式1
AbstractFactory schemalA=new ConcreteFactoryA();
Engineer engineer=new Engineer(schemalA);
engineer.makeAndUseComputer();
System.out.println("装机方案B");
//装机模式2
AbstractFactory schemalB=new ConcreteFactoryB();
engineer.setSchemal(schemalB);
engineer.makeAndUseComputer();
}
}
output:
装机方案A
Intell cpu 正在计算.....pins:1156
技嘉主板正在安装.....pin数:1156
装机方案B
AMD cpu 正在计算.....pins:939
微星主板正在安装.....pin数:939
欢迎与广大coder交流技术
QQ:1228935432
WX:WX1228935432
设计模式系列 1——StaticFactory(静态工厂),AbstractFactory(抽象工厂)的更多相关文章
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合. 看代码: 7.1.解释 main(),女 ...
- 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...
- Android设计模式(十二)--抽象工厂模式
问题: 抽象工厂模式,是一个,狠恶心的模式,那么这个模式在Android有没实用到过呢? 1.定义: 抽象工厂模式:为创建一组相关或者是相互依赖的对象提供一个接口,而不须要指定他们的详细类. 2.使用 ...
- Head First设计模式——简单工厂、工厂、抽象工厂
前言:按照惯例我以Head First设计模式的工厂模式例子开始编码学习.并由简单工厂,工厂模式,抽象工厂模式依次演变,归纳他们的相同与不同. 话说Head First认为简单工厂并不是设计模式,而是 ...
- 设计模式--简单工厂VS工厂VS抽象工厂
前几天我一直在准备大学毕业生,始终绑起来,如今,终于有时间去学习设计模式.我们研究今天的话题是植物三口之家的设计模式的控制--简单工厂VS工厂VS抽象工厂. 经过细心推敲,我们不难得出:工厂模式是简单 ...
- php设计模式课程---3、为什么会有抽象工厂方法
php设计模式课程---3.为什么会有抽象工厂方法 一.总结 一句话总结: 解决简单工厂方法增加新选择时无法满足面向对象编程中的开闭原则问题 1.什么是面向对象编程中的开闭原则? 应该对类的增加开放, ...
- AbstractFactory(抽象工厂模式)
AbstractFactory(抽象工厂模式) 有些情况下我们需要根据不同的选择逻辑提供不同的构造工厂,而对于多个工厂而言需要一个统一的抽象 <?php class Config { publi ...
- 设计模式(4)--AbstractFactory(抽象工厂模式)--创建型
1.模式定义: 抽象工厂是应对产品族概念的,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类 2.模式特点: 抽象工厂模式为创建一组对象提供了一种解决方案.与工厂方法模式相比,抽象工 ...
- C++设计模式-AbstractFactory抽象工厂模式
AbstractFactory 要创建一组相关或者相互依赖的对象 作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. UML结构图: 抽象基类: 1)AbstractProdu ...
随机推荐
- 44. Wildcard Matching
题目: Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single charact ...
- OpenCV源码阅读(1)---matx.h---mat类与vec类
matx.h matx类是opencv中的一个基础类,其位于core模块中,所执行的操作时opencv矩阵和向量的运算.如果熟悉基于matlab的图像处理,那么很容易想到,所有对图像的操作归根结底都是 ...
- C# 使用ManualResetEvent 进行线程同步
上一篇我们介绍了AutoResetEvent,这一篇我们来看下ManualResetEvent ,顾名思义ManualResetEvent 为手动重置事件. AutoResetEvent和Manua ...
- hadoop拾遗(三)---- 多种输入
虽然一个MapReduce作业的输入可能包含多个输入文件(由文件glob.过滤器和路径组成),但所有文件都由同一个InputFormat和同一个Mapper来解释.然而,数据格式往往会随时间而演变,所 ...
- SQLserver临时表
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME='#temp') DROP TABLE #tempGOSELECT ID,XM,ADDDW INTO #t ...
- WPF中的Drawing
以前在用WinForm的时候,可以通过GDI+接口在窗体上动态绘制自定义的图形.在WPF中有没有对应的API呢,最近项目中用到了这个,在这里总结一下. WPF中的Drawing主要提供了几类API: ...
- 通俗易懂的讲解iphone视图控制器的生命周期
IOS 视图控制器的生命周期非常非常重要,所以我有必要写个文章来和大家一起探讨问题. 今天在学习视图控制器的生命周期,也看了一下网上的一些资料,但总觉得不是那么好理解,首先我们来看一张图: 先粗略讲一 ...
- linux/unix网络编程之 select
转自http://www.cnblogs.com/zhuwbox/p/4221934.html linux 下的 select 知识点 unp 的第六章已经描述的很清楚,我们这里简单的说下 selec ...
- 学军NOI训练13 T3 白黑树
唉,大学军有自己的OJ就是好,无限orz 只有周六的比赛是开放的囧,这场比赛最后因为虚拟机卡住没有及时提交…… 否则就能让大家看到我有多弱了…… 前两题题解写的很详细,可以自己去看,我来随便扯扯T3好 ...
- VB程序逆向反汇编常见的函数
VB程序逆向常用的函数 1) 数据类型转换: a) __vbaI2Str 将一个字符串转为8 位(1个字节)的数值形式(范围在 0 至 255 之间) 或2 个字节的数值形式(范围在 -32,7 ...