方法工厂模式

在简单工厂模式中我们发现一个问题就是我们的工厂是比较死的,如果我们新增一个产品,就需要改变工厂模式的判断条件

很明显这是不符合我们要求的。

方法工厂模式中我们有四种角色: 抽象产品 具体产品 抽象工厂 具体工厂

我们产品是产品 工厂是工厂 我们一个产品对应一个具体工厂  。

详细见下面代码:

//抽象产品 
public interface Color {
	public void showColor();
}
//具体产品1
public class RedColor implements Color {
	@Override
	public void showColor() {
		System.err.println("show red");
	}
}

//具体产品2
public class RedColor implements Color {
	@Override
	public void showColor() {
		System.err.println("show yelow");
	}
}

//抽象工厂

public interface ColorFactory {

	public Color newInstance();

}

//工厂实现:
public class RedColorFactory implements ColorFactory {

	@Override
	public Color newInstance() {
		return new RedColor();
	}
}

//工厂实现

public class YellowColorFactory implements ColorFactory {

	@Override
	public Color newInstance() {
		return new YellowColor();
	}
}

这样调用就可以实现:
               ColorFactory colorFactory = new RedColorFactory();
		Color redColor = colorFactory.newInstance();
		redColor.showColor();

		ColorFactory factory2 = new YellowColorFactory();
		Color yellowColor = factory2.newInstance();
		yellowColor.showColor();

以上代码就可以避免简单工厂的问题

假设我们需要一个BluColor 就新增一个BlurColor的实现类,一个BlueColorFactory的实现类

对原有的代码没有任何修改的地方

ColorFactory factory3 = new BlueColorFactory();
Color blueColor = factory3.newInstance();
blueColor.showColor();

灵活使用

缺点:

  • 在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。

自己注解: 我们增加了一个blueColor就得增加一个产品实现一个工厂实现 成对增加

  • 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。

自己注解: 日志记录 针对日志记录的方式是数据库 文件 这些都可以放在配置文件中间利用反射区构建

一个日志记录的抽象类  2个日志记录的具体实现类 分别是文件和数据库

这些都可以放在配置文件中利用DOM和反射区指定具体的实现方式

时间: 2024-08-27 08:03:52

方法工厂模式的相关文章

静态方法工厂模式

工厂模式有三种方法来实现,一种是通过传入参数的名称来决定创建哪一个产品,这种方法有很大的缺点,就是如果传入的产品名称如果不小心错误的话,就是无法来创建我们想得到的产品的.另一种是方法工厂模式,这种工厂模式中对应每一个产品有一个创建方法,这样创建了工厂实例以后,直接通过工厂实例就可以调用相应的产品的创建方法来创建我们需要的产品.但是这种工厂模式需要创建工厂实例,一个工厂可能使用的地方有很多,一直创建实例不好,所以就有了静态方法工厂模式. package mode.factory.static_me

设计模式 工厂模式 从卖肉夹馍说起

今天继续设计模式之旅,给大家带来工厂模式,简单列一下这个模式的家族: 1.静态工厂模式 2.简单工厂模式 3.工厂方法模式 4.抽象工厂模式 是不是觉得,我勒个去,这工厂还能列出这么多分类,哈哈,下面开始各个击破. 1.静态工厂模式 这个最常见了,项目中的辅助类,TextUtil.isEmpty等,类+静态方法.下面开始详细介绍:略. 2.简单工厂模式 下面开始谈谈卖肉夹馍,最近程序员卖肉夹馍很火,啥时候大牛们都去卖了,我等就崛起了,哈哈. 首先你得有个店:RoujiaMoStore packa

Java设计模式—工厂方法模式&抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义:Creator为抽象创建 类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的. 工厂方法模式的扩展方式有很多种,下边是工厂方法模式一个比较实用的源代码: 抽象产品类: pub

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

设计模式之工厂模式-工厂方法(02)

接着上一篇的工厂模式,工厂方法.由于简单工厂的扩展性不好,下面工厂方法,在这上面有了优化! (二)工厂方法(多态工厂模式) 工厂方法描述:定义一个创建产品对象的工厂接口(总厂是接口,里面只规定了获得具体产品实例的方法),实际创建工作推迟到实现总厂接口的子类当中.这样的好处是,可以在不修改具体工厂角色的情况下引进新的产品(即是不像简单工厂那样,增加一个具体产品,比如:增加了个浙大学生,要把在工厂中的方法中增加逻辑判断,),利于维护了: 工厂方法的角色及其职责:(1)抽象工厂角色[creator]:

工厂模式——工厂方法模式

工厂方法模式,咋一看在这个计算器程序里好像反而使程序变得更加“复制”,确实代码量好像是增加了,到底有什么好处呢?我想多领会领会,必然有它存在的理由. 我们先来看看“简单工厂模式”和“工厂方法模式”的类继承关系.上篇提到的“简单工厂模式”的类继承关系如下图所示: “工厂方法模式”的类继承关系如下图所示: 发现四个运算类分别有了各自的工厂类,这是为什么呢?我们先来实现代码. 运算符抽象类以及四个它的实现类不做任何变动,参照上篇. 由于多了四个工厂类,所以把工厂类抽象成一个工厂类接口. package

详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博文,并不是像一些"非主流"的爱情观那样"宁缺毋滥". 只是其一呢,因为相当于给自己做一个总结,加深一下自己这方面的认识,因为掌握了和把它写出来我感觉后者还可以对技能有一个提升,其二呢是因为最近公司有一个内部的training需要讲设计模式. v写在前面 在这里呢,需要向

设计模式(二)工厂模式:2-工厂方法模式

模拟场景: 继续沿用在简单工厂模式中讨论的,运算器相关的场景. 思想: 考虑之前最初的设计,简单工厂模式中,最大的问题在于,面对新增的需要在工厂中创建的对象,对其的修改会违反开闭原则. 工厂方法模式(Factory Method)对于这种问题的解决方案是:将生产运算器的工厂抽象出来(AbsOperationFactory),然后为原来每一个需要创建的对象(继承AbsOperation),都建立一个专门的工厂.这样一来,可以巧妙地利用多态的性质,完成代码的解耦. 由此可见,工厂方法模式,是模板方法

简单工厂模式(静态工厂方法模式)

以计算器程序为例:只需输入运算符号,程序就实例化出合适的对象.通过多态,返回父类的方式实现了计算器的结果. 1)静态工厂方法统一管理对象的创建. 静态工厂方法通过传入的参数判断决定创建哪一个产品的实例,封装了对象的创建,客户端只管消费,实现了对责任(模块)的分割. 2)静态工厂方法推迟了产品的实例化. 通过XML配置文件就能改变具体创建的产品实例,修改为其他的产品实例,代码不须重新编译. 简单工厂模式结构图 C++代码实例实现: 1 #include<iostream> 2 using nam