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();

	}

}

运行实例如下:

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

喜欢的朋友关注我。

时间: 2024-08-25 05:47:17

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

Java研究之学习设计模式-抽象工厂模式详解

 简介:          当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产[1] 品角色都有两个具体产品.抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化.每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例. 每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.(摘自百度百科) 话语说得太抽象,程序员最好的表示方式

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

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

设计模式 - 抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 参考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/de

设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 參考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不须要明白指定详细类. 所有代码: http://download.csdn.net/

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

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

java常用设计模式之 工厂模式

工厂模式: 定义 一个用于创建对象的接口,让子类决定实例化哪一个类. 一句话概括: 是一个类的实例化延迟到其子类.     适用于 以下情况: ①:当一个类 ,不知道它所必须创建的对象的类的时候. ②:当一个类,希望由它的子类来指定它所创建的对象的时候. ③:当类将创建对象的职责给多个帮助子类中的一个,并且希望将哪一个帮助子类是代理这一信息局部化的时候. 说明: ① Product :定义工厂方法所创建的对象的接口. ② ConcreteProduct:实现Product 接口. ③ Creat

Android设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

php设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 <?php 2 /* 3 * php设计模式——抽象工厂模式(Abstract Factory) 4 */ 5 6 7 /* 8 * I

5. 星际争霸之php设计模式--抽象工厂模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248178.html============================================