Java与设计模式-抽象工厂模式

首先说明,文章较长,保证你有耐心看完肯定能懂,没耐心直接点×即可。

抽象工厂模式,是创建型设计模式之一。抽象型工厂模式适合产品确定,产品线不确定的类型,怎么讲?通过一个具体例子来讲一下吧。例如某电脑厂商要生产电脑,也就是电脑这个产品确定,而电脑配置不确定,这种情况可以用抽象工厂模式来解决。类图如图所示:

代码实现完全结合UML类图,结合图就可以完成系统创建。

本实例里是抽象类ComputerFactory(对应UML类图中的AbstractFactory):

package com.factory.demo;

public abstract class ComputerFactory {
	public abstract CPU createCPU();
	public abstract MainBoard createMainBoard();
	public abstract RAM createRAM();

}

有三个方法,生产CPU,生产主板和生产内存。

产品抽象接口,CPU(对应UML类图中的ProductA):

package com.factory.demo;

public interface CPU {

	void cpu();
}

产品抽象接口,主板(对应UML类图中的ProductB):

package com.factory.demo;

public interface MainBoard  {
	 void mainboard();
}

产品抽象接口,内存((对应UML类图中的ProductC)):

package com.factory.demo;

public interface RAM {

	void ram();
}

下面是具体产品,CPU的I3(对应UML类图中的ProductA1):

package com.factory.demo;

public class I3CPU implements CPU {

	public void cpu() {
		System.out.println("i3处理器");

	}

}

具体产品,CPU的I5(对应UML类图中的ProductA2):

package com.factory.demo;

public class I5CPU implements CPU {

	public void cpu() {
		System.out.println("i5处理器");

	}

}

具体产品,主板 联想主板(对应UML类图中的ProductB1):

package com.factory.demo;

public class LenovoMainBoard implements MainBoard {

	@Override
	public void mainboard() {
		System.out.println("华硕主板");

	}

}

具体产品,主板 华硕主板(对应UML类图中的ProductB2):

package com.factory.demo;

public class ASUSMainBoard implements MainBoard {

	@Override
	public void mainboard() {
		System.out.println("联想主板");

	}

}

具体产品 内存 三星内存(对应UML类图中的ProductC1):

package com.factory.demo;

public class SamsungRAM implements RAM {

	public void ram() {
		System.out.println("三星内存");

	}

}

具体产品,内存 金士顿内存(对应UML类图中的ProductC2):

package com.factory.demo;

public class KingStoneRAM implements RAM {

	public void ram() {
		System.out.println("金士顿内存");

	}

}

具体工厂类1,Computer1继承抽象工厂类(对应UML类图中的Factory1):

package com.factory.demo;

public class Computer1 extends ComputerFactory {
	/**
	 * 组装电脑1,用的i3处理器、联想的主板和三星的内存
	 * @return
	 */

	@Override
	public CPU createCPU() {
		return new I3CPU();
	}

	@Override
	public MainBoard createMainBoard() {
		return new LenovoMainBoard();
	}

	@Override
	public RAM createRAM() {
		return new SamsungRAM();
	}

}

具体工厂类2,Computer2继承抽象工厂类(对应UML类图中的Factory2):

package com.factory.demo;

public class Computer2 extends ComputerFactory {
	/**
	 * 组装电脑2,用的i5处理器、华硕的主板和金士顿的内存
	 * @return
	 */

	@Override
	public CPU createCPU() {
		return new I5CPU();
	}

	@Override
	public MainBoard createMainBoard() {
		return new ASUSMainBoard();
	}

	@Override
	public RAM createRAM() {
		return new KingStoneRAM();
	}

}

这时创建一个测试类:

package com.factory.demo;

public class TestFactory {

	public static void main(String[] args) {
		//电脑1
		ComputerFactory computer1=new Computer1();
		System.out.println("组装产品类型1:");
		computer1.createCPU().cpu();
		computer1.createMainBoard().mainboard();
		computer1.createRAM().ram();

		//电脑2
		ComputerFactory computer2=new Computer2();
		System.out.println("组装产品类型2:");
		computer2.createCPU().cpu();
		computer2.createMainBoard().mainboard();
		computer2.createRAM().ram();

	}

}

运行测试类:

总结一下:上面每一个类或接口都对应了UML类图中的每一个元素,可以参照UML类图构建系统。本系统好处是分离了接口和实现,实现产品下种类切换时十分灵活容易(也就是再制作一条产品Computer3的生产线很容易)。缺点也是显而易见,会造成类爆炸性增长可以参照下图:

还有一个缺点就是不容易增加其他产品类,增加一个产品类就需要修改抽象工厂,那么所有具体工厂类也必须被修改。

下面我们看一下如何增加一条Computer3的生产线:

Computer3的配置是i7 CPU+华硕主板+金士顿内存。这时我们首先要实现一个i7的CPU(对应UML类图中的ProductA3):

package com.factory.demo;

public class I7CPU implements CPU {

	public void cpu() {
		System.out.println("i7处理器");

	}

}

然后是具体工厂类3,Computer3继承抽象工厂类(对应UML类图中的Factory3):

package com.factory.demo;

public class Computer3 extends ComputerFactory {
	/**
	 * 组装电脑3,i7 CPU+华硕主板+金士顿内存
	 * @return
	 */

	@Override
	public CPU createCPU() {
		return new I7CPU();
	}

	@Override
	public MainBoard createMainBoard() {
		return new ASUSMainBoard();
	}

	@Override
	public RAM createRAM() {
		return new KingStoneRAM();
	}

}

测试类增加Computer3的代码,增加后如下:

package com.factory.demo;

public class TestFactory {

	public static void main(String[] args) {
		//电脑1
		ComputerFactory computer1=new Computer1();
		System.out.println("组装产品类型1:");
		computer1.createCPU().cpu();
		computer1.createMainBoard().mainboard();
		computer1.createRAM().ram();

		//电脑2
		ComputerFactory computer2=new Computer2();
		System.out.println("组装产品类型2:");
		computer2.createCPU().cpu();
		computer2.createMainBoard().mainboard();
		computer2.createRAM().ram();

		//电脑3
		ComputerFactory computer3=new Computer3();
		System.out.println("组装产品类型3:");
		computer3.createCPU().cpu();
		computer3.createMainBoard().mainboard();
		computer3.createRAM().ram();

	}

}

运行实例如下:

可以看出来扩展生产线变得很容易,系统扩展性大大增强。

喜欢的朋友关注我。

时间: 03-06

Java与设计模式-抽象工厂模式的相关文章

设计模式-抽象工厂模式(C#)

设计模式--抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构.当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构.属于不同类型的具体产品时就可以使用抽象工厂模式. 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建,当一个工

设计模式——抽象工厂模式学习

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的. 抽象工厂设计模式概念: 针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设计模式的精髓,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.有些观点认为抽象工厂模式是为了解决客户端代码与工厂类的耦合问题,我认为这种观点的解决方案只是简单工厂模式的一个应用,而这种观点认为的抽象工厂模式是: 工厂模式+简单工厂模式=抽象工厂模式,这是不正确. 针对的问题: 针对

JAVA设计模式--抽象工厂模式

抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关的代码.由应用程序调用以创建对应的具体产品的对象.在java中它由具体的类来实现.抽象产品角色:它是具体产品继承的父类或者是实现的接口.在java中一般

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

抽象工厂模式(Abstract Factory Pattern)是属于创建型的设计模式,意在创造一个抽象的工厂,而后再由实例化出的具体的工厂来进行生产. 何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品. 应用实例:工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品).时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装.商务男装.时尚女装.时尚男装,这些也都是成套的,即一系列具体产品.假设一种情况(现实中是不存在的,要不然

Java设计模式——抽象工厂模式(Abstract factory)

抽象工厂模式可以向客户提供接口,使得客户端在不必指定产品具体类型的情况下创建多个产品族中的产品对象. 系统的设计 采用抽象工厂模式设计出的系统类图如下: 从上图可以看出,抽象工厂模式涉及到角色: 抽象工厂角色(AbstractFactory):担任这个角色的是工厂方法模式的核心,它与应用系统的商业逻辑无关.通常使用Java接口或者抽象Java类实现,而所有的具体工厂类都必须实现这个Java接口或者继承这个抽象Java类. 具体工厂类(ConcreteFactory)角色:这个角色直接在客户端的调

Java设计模式-抽象工厂模式(Abstract Factory )

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码. 为工厂类做一个统一的父类接口,可用于扩展 因为抽象工厂不太好理解,先看看图,然后就和代码,就比较容易理解. 例子: public interface Sender { public void Send(); } 两个实现类

24种设计模式--抽象工厂模式【Abstract Factory Pattern】

女娲造人,人是造出来了,世界是热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类重新洗牌,准备重新开始制造人类. 由于先前的工作已经花费了很大的精力做为铺垫,也不想从头开始了,那先说人类(Product 产品类)怎么改吧,好,有了,给每个人类都加一个性别,然后再重新制造,这个问题解决了,那八卦炉怎么办?只有一个呀,要么生产出全都是男性,要不都是女性,那不行呀,有了,把已经有了一

设计模式:抽象工厂模式

原文地址:http://leihuang.org/2014/12/03/abstract-factory/ Creational 模式 物件的产生需要消耗系统资源,所以如何有效率的产生.管理 与操作物件,一直都是值得讨论的课题, Creational 模式即与物件的建立相关,在这个分类下的模式给出了一些指导原则及设计的方向.下面列举到的全属于Creational 模式 Simple Factory 模式 Abstract Factory 模式 Builder 模式 Factory Method

C#设计模式——抽象工厂模式

一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是本专题所要介绍的内容. 二.抽象工厂详细介绍