抽象工厂模式
2018-12-17 本文已影响26人
Jackson杰
一 简介
抽象工厂模式也是属于创建型模型,所谓创建型模型,提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用new直接实例化对象,这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。抽象工厂模式属于23种GOF设计模式之一。
二 定义
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂模式主要解决的是系统的产品多于一个的产品族的创建问题。
下面是抽象工厂的UML图:
模拟场景
抽象工厂模式解决的事一个产品族里有多个产品的问题。
我们已生产手机为例,我们知道手机产品是一系列产品的组合,其中最重要的的处理器和屏幕,处理器主要有两个品牌,高通和联发科,屏幕也选两个,三星和LG,下面就用抽象工厂模式实现不同手机的生产过程。
1 建立两个产品的接口
/**
* CPU的接口
*/
public interface ICPU {
/**
* cpu具有计算能力
*/
public void calculate();
}
public interface IScreen {
public void display();
}
2 定义抽象工厂
抽象工厂分别创建两个产品的对象
public interface AbstractFactory {
/**
* 创建CPU对象
* @return
*/
public ICPU createCpu();
/**
* 创建屏幕对象
* @return
*/
public IScreen createScreen();
}
3 具体的产品实现
高通CPU产品
public class QualcommCpu implements ICPU {
@Override
public void calculate() {
System.out.println("高通cpu计算中...");
}
}
MTK CPU产品
public class MTKCpu implements ICPU {
@Override
public void calculate() {
System.out.println("联发科cpu计算中....");
}
}
三星的屏幕产品
public class SamsungScreen implements IScreen {
@Override
public void display() {
System.out.println("三星的屏幕显示中....");
}
}
LG的屏幕产品
public class LGScreen implements IScreen {
@Override
public void display() {
System.out.println("LG的屏幕显示中...");
}
}
4 具体的工厂实现
在这里实现两个产品组合,即两款手机,一款采用高通的CPU+三星的屏幕,一款采用联发科的CPU+LG的屏幕,下面是两款手机的具体实现。
/*
* 手机1,高通cpu+三星屏幕
* @author Jackson
* @version 1.0.0
* since 2018 12 14
*/
public class Phone1 implements AbstractFactory {
@Override
public ICPU createCpu() {
return new QualcommCpu();
}
@Override
public IScreen createScreen() {
return new SamsungScreen();
}
}
/*
* MTK CPu+LG 屏幕
* @author Jackson
* @version 1.0.0
* since 2018 12 14
*/
public class Phone2 implements AbstractFactory {
@Override
public ICPU createCpu() {
return new MTKCpu();
}
@Override
public IScreen createScreen() {
return new LGScreen();
}
}
5 客户端实现
System.out.println("生产高通CPU+三星屏幕的手机");
Phone1 phone1=new Phone1();
phone1.createCpu().calculate();
phone1.createScreen().display();
System.out.println("==============================");
System.out.println("生产MTK CPU+LG屏幕的手机");
Phone2 phone2=new Phone2();
phone2.createCpu().calculate();
phone2.createScreen().display();
抽象工厂模式适用于对于一个产品的产品族,而系统只消耗了某一个产品。
优点:
具体的代码在用用层代码隔离,无需关心创建的细节。
将一系列的产品统一到一起创建
缺点:
必须规定所有可能被创建的产品集合,产品族中添加新产品比较困难。