java语言实现创建型设计模式—抽象工厂模式

一、描述

抽象工厂模式是在工厂方法的模式上进一步抽象而来,如果说工厂方法模式是对一个产品结构的创建而言的话,那么抽象工厂模式则是针对多个产品结构而言的,它被用来一次创建多个不同的产品对象。

我们要创建一个摩托车轮胎和摩托车把手,又要创建一个自行车轮胎和自行车把手,如果我们使用工厂方法模式的话我们需要四个类:创建摩托车轮胎的工厂类,创建摩托车把手的工厂类,创建自行车轮胎的工厂类和创建自行车把手的工厂类,但是如果我们使用抽象工厂方法的话,我们需要创建两个工厂类:创建摩托车轮胎和把手的工厂类,创建自行车轮胎和把手的工厂类,也就是将工厂方法进一步抽象,所有摩托车产品归为一类,所有自行车产品归为一类。如果还要创建摩托车的车座和自行车的车座,那么我们只要在摩托车类和自行车类中分别加入一个创建车座的方法即可。

抽象工厂模式适用于创建不同产品的多个结构,使用抽象工厂类负责定义创建对象的接口,这一系列对象的创建工作是由有是实现抽象工厂的具体工厂类来具体完成,抽象工厂模式主要由4部分组成:抽象工厂类,实现抽象工厂类的具体工厂类,抽象类和实现抽象类的具体类。

二、抽象工厂模式的优缺点

优点:在抽象方法模式中,客户端不再负责对象的创建工作,而是把这个任务交给了具体的工厂类,从而减轻了客户端的负担,也明确了各个类的职责。在这个模式中同一个产品的多个不同部件放在一个工厂类中,这样客户端的调用就变得非常简单,而且如果要修改或者增加这些部件就只要修改对应的一个工厂类和实现该工厂类的具体子类即可。

缺点:每次有新的部件加入都需要修改抽象工厂类的设计,同时也要修改实现这个抽象工厂类的所有具体工厂类,需要额外编码增加了代码量。如果每个抽象工厂类中创建的产品数量非常大,在客户端组装各个具体工厂创建的对象的时候就会很复杂,导致客户端代码非常庞大。

三、源代码

总述:对于上一篇博文中采用工厂方法模式编写的薪资计算系统代码,我此次采用抽象工厂的模式,并且我们不仅要计算薪资还要计算社保,也就是有一个抽象工厂类,该类中有两个抽象方法,分别计算薪资和社保,然后有两个分公司类工厂类用于创建自己公司的薪资和社保对象。

1、抽象工厂类

package tong.day5_1.abstractFactory;
/**
 *抽象的工厂接口,在这个接口中定义了一个两个抽象方法,分别创建薪资类对象和社保类对象,由实现该接口的具体类重写该方法,分别创建自己类的对象
 * @author tong
 *
 */
public interface AbstractFactory {
	//抽象方法,用于创建各种类的对象
	public abstract Salary createSalary();
	public abstract Insurance createInsurance();

}

2、具体工厂类

package tong.day5_1.abstractFactory;

public class GuangdongFactory implements AbstractFactory {

	@Override
	public Salary createSalary() {
		return new GuangdongSalary();
	}

	@Override
	public Insurance createInsurance() {
		return new GuangdongInsurance();
	}

}
package tong.day5_1.abstractFactory;
/**
 * 具体工厂类实现抽象工厂中的所有方法,并返回该类的薪资对象和社保对象
 * @author Administrator
 *
 */
public class ZhejiangFactory implements AbstractFactory {

	@Override
	public Salary createSalary() {
		return new ZhejiangSalary();
	}

	@Override
	public Insurance createInsurance() {
		return new ZhejiangInsurance();
	}

}

3、抽象薪资类

package tong.day5_1.abstractFactory;
/**
 * 定义一个薪资接口,所有公司的具体薪资计算都实现这个接口,并重写计算薪资的方法computeSalary()
 * @author tong
 *
 */
public interface Salary {
	public void computeSalary();
}

4、两个公司的具体薪资类

package tong.day5_1.abstractFactory;
/**
 * 广东分公司的薪资计算类实现了Salary接口,并重写了该接口中的计算薪资的方法computeSalary()
 * @author tong
 *
 */
public class GuangdongSalary implements Salary {

	@Override
	public void computeSalary() {
		System.out.println("广东分公司薪资计算");

	}

}
package tong.day5_1.abstractFactory;
/**
 * 浙江分公司的薪资计算类实现了Salary接口,并重写了该接口中的计算薪资的方法computeSalary()
 * @author tong
 *
 */
public class ZhejiangSalary implements Salary {

	@Override
	public void computeSalary() {
		System.out.println("浙江分公司薪资计算");

	}

}

5、抽象社保类

package tong.day5_1.abstractFactory;
/**
 * 抽象社保类
 * @author tong
 *
 */
public interface Insurance {
	public abstract void computeInsurance();
}

6、两个子公司的具体社保类

package tong.day5_1.abstractFactory;

public class GuangdongInsurance implements Insurance {

	@Override
	public void computeInsurance() {
		System.out.println("广东分公司社会保险计算");

	}

}
package tong.day5_1.abstractFactory;

public class ZhejiangInsurance implements Insurance {

	@Override
	public void computeInsurance() {
		System.out.println("浙江分公司社会保险计算");

	}

}

7、客户端调用

package tong.day5_1.abstractFactory;

public class Client {
	public static void main(String[] args) {
		//创建抽象工厂类,使用多态,首先创建浙江分公司的工厂类对象
		AbstractFactory factory = new ZhejiangFactory();
		//使用浙江分公司的工厂类创建该公司的薪资和社保对象
		Salary salary = factory.createSalary();
		Insurance insurance = factory.createInsurance();
		//使用创建出来的薪资和社保对象分别调用计算薪资和计算社保的具体方法
		salary.computeSalary();
		insurance.computeInsurance();

		System.out.println("----------------");
		//创建抽象工厂类,使用多态,创建广东分公司的工厂类对象
		factory = new GuangdongFactory();
		//使用广东分公司的工厂类创建该公司的薪资和社保对象
		salary = factory.createSalary();
		insurance = factory.createInsurance();
		//使用创建出来的薪资和社保对象分别调用计算薪资和计算社保的具体方法
		salary.computeSalary();
		insurance.computeInsurance();
	}
}

三、运行结果

时间: 2024-10-05 04:09:30

java语言实现创建型设计模式—抽象工厂模式的相关文章

java语言实现创建型设计模式—工厂方法模式

一.描述 基于简单工厂模式中将所有类的创建和初始化放在一个工厂类中出现的问题,我们引进了工厂方法模式,该模式是GoF总结的23种设计模式的第一种,这个设计模式将一个工厂类拆分成多个具体的工厂类,每个具体的工厂类负责相应的类的对象的创建. 在工厂方法模式中,抽象工厂类负责定义创建对象的接口,具体对象的创建由实现该抽象工厂的具体工厂类来完成,它由四部分组成:抽象工厂类.实现抽象工厂类的具体工厂类.抽象类.实现抽象类的具体类. 二.工厂方法模式的优缺点 优点:在工厂方法模式中,创建对象的任务由具体的工

java语言实现创建型设计模式—创建者模式

一.描述 创建者模式单独利用一个创建者类来创建对象并组建对象之间的关系,以简化客户端调用的复杂性.相对于抽象方法模式来说,创建者模式增加了一个单独的用于组装对象和对象之间关系的创建者类,由该类来负责对象的组装,以此来更加清晰地划分各个类的职责. 创建者模式将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示,而且对客户端屏蔽了对象的构建细节,该模式主要由5个部分组成:组装类.抽象创建者类,实现了抽象创建者类的具体创建者类,抽象产品类.实现了抽象产品类的具体产品类.在此可以看出

创建型设计模式(工厂模式)

在工厂模式中,我们创建对象而不将创建逻辑暴露给客户端. 首先,我们设计一个接口来表示Shape. public interface Shape { void draw(); } 然后我们创建实现接口的具体类. public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } } public

创建型设计模式之工厂模式

结构            意图         提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性     一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关的产品对象的设计以便进行联合使用时. 当你提供一个产品类库,而只想显示它们的接口而不是实现时. 1 using System; 2 3 // These classes could be part of a framework, 4 // which

java语言实现创建型设计模式—原型模式(Prototype)

一.描述 原型模式是通过一个原型对象来标明要创建的对象的类型,然后用复制这个原型对象的方法来拷贝创建更多的同类型对象.例如我们在程序的动态运行过程中有了一个对象,这个对象中包含了一系列的有效数据,我们此时需要一个和该对象完全相同的新对象,并且在拷贝之后,新旧对象之间没有任何联系,对任何一个对象的更改都不影响另一个对象. 在java中所有类都默认继承自java.lang.Object类,在这个Object类中有一个clone()方法,该方法将返回Object对象的一个拷贝. 我们让需要被拷贝的类实

java语言实现创建型设计模式—单例模式

一.描述 单例模式就是确保一个类只有一个实例对象,并且在实例对象必须自动创建,对外不提供该对象的构造方法,并向整个系统提供该实例.使用单例模式相当于整个系统共用该类的实例对象,对于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