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

来源:互联网 发布:mac鼠标滚轮没反应 编辑:程序博客网 时间:2024/05/21 20:23

一、描述

基于简单工厂模式中将所有类的创建和初始化放在一个工厂类中出现的问题,我们引进了工厂方法模式,该模式是GoF总结的23种设计模式的第一种,这个设计模式将一个工厂类拆分成多个具体的工厂类,每个具体的工厂类负责相应的类的对象的创建。

在工厂方法模式中,抽象工厂类负责定义创建对象的接口,具体对象的创建由实现该抽象工厂的具体工厂类来完成,它由四部分组成:抽象工厂类、实现抽象工厂类的具体工厂类、抽象类、实现抽象类的具体类。


二、工厂方法模式的优缺点

优点:在工厂方法模式中,创建对象的任务由具体的工厂类负责,一个具体类对应一个具体的工厂类,再由抽象工厂类定义所有具体工厂类创建对象的统一接口,客户端只负责调用具体类创建对应的对象。

如果有一个新的产品加入,那么只需要增加一个具体类和创建这个具体类的工厂类即可,不需要修改原来已有的代码,同一个类的代码量也不会变大,更利于后期的维护,增强了系统的可扩展性。

缺点:每新加一个产品就要增加两个类,需要额外地编写代码,增加了工作量。

三、源代码

1、抽象方法类:

package tong.day4_30.factoryMethod;/** *抽象工厂接口,在这个接口中定义了一个createSalary()方法,由实现该接口的具体类重写该方法,分别创建自己类的对象 * @author tong * */public interface Factory {//这是一个公共的抽象方法,用于创建各种类的对象public abstract Salary createSalary();}

2、具体方法类

package tong.day4_30.factoryMethod;/** * 具体的工厂方法,用于创建特定类的对象 * @author tong * */public class GuangdongSalaryFactory implements Factory {@Overridepublic Salary createSalary() {//返回GuangdongSalary类的对象return new GuangdongSalary();}}

package tong.day4_30.factoryMethod;/** * 具体的工厂方法,用于创建特定类的对象 * @author tong * */public class ZhejiangSalaryFactory implements Factory {@Overridepublic Salary createSalary() {//返回ZhejiangSalary类的对象return new ZhejiangSalary();}}

3、抽象类

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

4、具体类

package tong.day4_30.factoryMethod;/** * 广东分公司的薪资计算类实现了Salary接口,并重写了该接口中的计算薪资的方法computeSalary() * @author Administrator * */public class GuangdongSalary implements Salary {@Overridepublic void computeSalary() {System.out.println("广东分公司薪资计算");}}

package tong.day4_30.factoryMethod;/** * 浙江分公司的薪资计算类实现了Salary接口,并重写了该接口中的计算薪资的方法computeSalary() * @author Administrator * */public class ZhejiangSalary implements Salary {@Overridepublic void computeSalary() {System.out.println("浙江分公司薪资计算");}}

5、客户端调用

package tong.day4_30.factoryMethod;/** * 在客户端调用工厂方法来创建每个具体的工厂类对象,使用具体工厂类对象来创建不同的薪资对象,由薪资对象调用computeSalary()计算薪资; * 如果还想创建更多的公司薪资,那么就创建一个相应的薪资类,再创建一个相应的薪资计算的具体工厂类。 * @author tong * */public class Client {public static void main(String[] args) {//创建Factory对象,这里使用多态,创建不同的具体工厂类对象Factory factory = new GuangdongSalaryFactory();//使用具体的工厂类对象创建不同的薪资对象来计算薪资Salary salary = factory.createSalary();salary.computeSalary();factory = new ZhejiangSalaryFactory();salary = factory.createSalary();salary.computeSalary();}}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 仓鼠的脚被棉花怎么办 仓鼠的脚变黑了怎么办 夏天小仓鼠生了怎么办 把仓鼠摔出血了怎么办 仓鼠摔成骨折了怎么办 孩子被仓鼠咬了怎么办 仓鼠不咬磨牙石怎么办 仓鼠妈妈跑了宝宝怎么办 买的仓鼠繁殖了怎么办 仓鼠没有鼠粮了怎么办 仓鼠被踩吐血了怎么办? 买的蓝莓太酸怎么办 荷兰猪夏天掉毛怎么办 被猫抓伤肿了怎么办 荷兰猪鼻子破了怎么办 荷兰猪吃了包菜怎么办 龙猫不爱吃主粮怎么办 荷兰猪躲起来了怎么办 荷兰猪一直叫是怎么办 龙猫不吃粗的主粮怎么办 转龙猫中暑症状+龙猫中暑怎么办 火车上空调太冷怎么办 格力空调太冷怎么办 未满月龙猫宝宝怎么办 房间小空调太冷怎么办 奶猫半夜不睡觉怎么办 龙猫不喜欢吃草粒怎么办 龙猫一直在发抖怎么办 龙猫牙齿掉了怎么办 龙猫晚上很吵怎么办 小狗把手咬破了怎么办 夏天仓鼠太热了怎么办 仓鼠玩转轮会摔怎么办 如何发截图不会发现吐怎么办 嘴巴烂了药过敏怎么办 非法校车被扣了怎么办 手指削掉一块肉怎么办 在广州误走brt道怎么办 平安eq测试没过怎么办 物业在小区私自建房怎么办 婚后父母出钱买房离婚怎么办