简单工厂模式又叫做静态工厂方法模式,根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个共同的父类和共同的方法,但每个方法 执行的行为不同。简单工厂模式实际上不属于 23 个 GOF 模式,但它可以作为工厂方法模式的一个引导。
工厂模式如何工作:
工厂类( Creator )角色:该角色是工厂方法模式的核心,含有按照一定商业逻辑创建产品。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体类实现。
抽象产品( Product )角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个接口或者抽象类实现。
具体产品( Concrete Product )角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体类实现。
下面我们来看看工厂模式的的优点和缺点:
优点:
1 、分工明确,各司其职。
2 、客户端不再创建对象,而是把创建对象的职责交给了具体的工厂去创建。
3 、客户端只负责调用。
缺点:
1 、工厂的静态方法无法被继承。
2 、代码维护不易 ( 对象要是很多的话,工厂是一个很庞大的类 ) 。
3 、这种模式对 “ 开 - 闭 ” 原则支持的不够,如果有新的产品加入到系统中就要修改工厂类。
使用时机:
客户端需要创建对象,但是数量不多的情况下,可以考虑使用简单工厂模式。
如何使用:
1. 使用字符串唯一标识符或者 id 号。
public class SimpleFactory {
public static Product factoryProduct(String productName) {
if(productName.equals("product1")) {
return new Product1();
}else if(productName.equals("product2")) {
return new Product2();
}
return null;
}
}
2. 使用反射:
public class AnimalFactory {
/**
* 静态工厂方法
* @param clazz class
* @return 传进来的类的实例
*/
public static Object factory(Class clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
1. jdk 中 dataFormat 简单工厂使用示例
Locale locale = Locale.FRENCH;
Date date = new Date();
String now = DateFormat.getTimeInstance(DateFormat.DEFAULT, locale).format(date);
try {
date = DateFormat.getDateInstance(DateFormat.DEFAULT, locale).parse("16 nov. 01");
System.out.println(date);
} catch (ParseException e) {
System.out.println("Parsing exception:" + e);
}
2. jdk 中 Boolean 的 valueOf 方法
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
public static Boolean valueOf(String s) {
return toBoolean(s) ? TRUE : FALSE;
}
3. jdk 中 Integer 的 valueOf 方法
Integer a = Integer.valueOf(3);
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
4. 抽象类 java.util.Calendar 的 getInstance 方法将根据不同的情况返回不同的 Calendar 子类的对象
private static Calendar createCalendar(TimeZone zone,
Locale aLocale)
{
// If the specified locale is a Thai locale, returns a BuddhistCalendar
// instance.
if ("th".equals(aLocale.getLanguage())
&& ("TH".equals(aLocale.getCountry()))) {
return new sun.util.BuddhistCalendar(zone, aLocale);
} else if ("JP".equals(aLocale.getVariant())
&& "JP".equals(aLocale.getCountry())
&& "ja".equals(aLocale.getLanguage())) {
return new JapaneseImperialCalendar(zone, aLocale);
}
// else create the default calendar
return new GregorianCalendar(zone, aLocale);
}
可以想象到 : 当调用 Calendar 类的 getInstance 方法时 , 该方法会根据系统的默认地区信息返回一个合适的 Calendar 子类对象。而且将来如果需要支持某个其他地区的特殊历法,可以改变 Calendar 的 getInstance 方法逻辑,但 Calendar 的使用者无需承担这种变化的影响。
4. spring.core用来判断jdk的版本:
http://www.blogjava.net/killme2008/archive/2007/04/11/109675.html
简单工厂模式是否支持 OCP 呢?
答案:只能在有限程度上支持。因为 OCP 要求不能对以 “ 发布 ” 的行为做修改,例如字段或方法,但是可 以进行扩展,可以增加字段或方法。而简单工厂模式中的工厂类不能做到这一点,当加入新的产品类的时候不得不修改工厂类创建产品方法的逻辑。
- 大小: 28.8 KB
分享到:
相关推荐
工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...
在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...
本篇文章将对三种主要的工厂模式:简单工厂、工厂方法和抽象工厂进行深入的对比和总结。 **简单工厂模式** 是最基础的工厂模式形式,它提供一个静态方法或类来创建对象。在这个模式中,工厂是负责创建对象的中心...
案例一:简单工厂方法模式 这个案例可能涉及到一个`IProduct`接口,定义了产品的基本行为,比如`Execute()`方法。然后有两个具体的产品类,例如`ProductA`和`ProductB`,它们实现了`IProduct`接口。接下来,我们会有...
工厂方法、简单工厂和抽象工厂是创建型设计模式的三种不同形式,它们都关注于对象的创建过程,但各有其特点和适用场景。 1. **工厂方法(Factory Method)**: 工厂方法模式定义了一个创建对象的接口,但让子类...
在软件设计模式中,"抽象工厂"、"工厂方法"和"简单工厂"都是创建型设计模式,它们都用于封装对象的创建过程,提供了一种间接的途径来创建对象,从而使得代码更加灵活,易于扩展。下面将详细介绍这三个工厂模式。 ##...
《工厂方法模式在简易计算器重构中的应用》 在软件工程中,设计模式是解决常见问题的模板,它们为程序员提供了一种标准化的解决方案。工厂方法模式(Factory Method Pattern)是面向对象设计模式的一种,它在实际...
本文将深入探讨两种常见的工厂模式:简单工厂模式和工厂方法模式。 简单工厂模式,也称为静态工厂模式,是一种创建型设计模式,它提供了一个静态方法来创建对象,而无需暴露实例化逻辑。在简单工厂模式中,一个单一...
本文将深入探讨三种工厂模式:简单工厂模式、工厂方法模式以及抽象工厂模式,并结合源码分析其应用场景和优缺点。 1. 简单工厂模式 简单工厂模式(Simple Factory Pattern)是一种静态工厂方法,它通过一个公共的...
学生课程设计的C++,Qt,设计模式,使用到简单工厂方法,对于登录系统,分角色的登录对于锻炼编程能力很有帮助,学生课程设计的C++,Qt,设计模式,使用到简单工厂方法,对于登录系统
学生课程设计的C++,Qt,设计模式,使用到简单工厂方法,对于登录系统,分角色的登录对于锻炼编程能力很有帮助,学生课程设计的C++,Qt,设计模式,使用到简单工厂方法,对于登录系统,分角色的登录对于锻炼编程能力很有...
同时,工厂方法模式也可以避免简单工厂模式的缺点,即当有新产品要加入到系统中时,必须对工厂类进行修改,以加入必要的处理逻辑。 工厂方法模式适合在如下场合中运用: * 当无法得知必须创建的对象属于哪个类的...
工厂模式分为三种主要类型:简单工厂模式、普通工厂模式(也称为工厂方法模式)和抽象工厂模式。 1. **简单工厂模式**: - 简单工厂模式中,有一个中心工厂类,它负责根据输入条件(通常是一个参数)来创建具体的...
学生课程设计的C++,Qt,设计模式,使用到简单工厂方法,对于登录系统,分角色的登录对于锻炼编程能力很有帮助,学生课程设计的C++,Qt,设计模式,使用到简单工厂方法,对于登录系统,分角色的登录对于锻炼编程能力很有...
工厂方法模式作为创建型模式中的一种,提供了一种创建对象的优雅方式,它不仅使对象的创建与使用分离,还极大地提高了系统的扩展性和灵活性。本文将深入探讨工厂方法模式的内部机制,以及通过反射和配置文件技术增强...
在这个例子中,我们讨论的是如何使用工厂方法模式(Factory Method Pattern)实现一个简易计算器。工厂方法模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,一个工厂接口或者抽象类...
在Java等面向对象编程语言中,我们可以利用抽象类和抽象方法来实现简单工厂模式。 首先,我们需要理解什么是抽象方法。在面向对象编程中,抽象方法是一种没有具体实现的方法,它只有声明,没有具体的操作。这样的...
3. 简单工厂类(SimpleFactory):包含创建产品的方法,根据输入条件返回具体产品实例。 4. 抽象工厂接口(AbstractFactory):定义创建产品族的接口。 5. 具体工厂类(ConcreteFactory1, ConcreteFactory2等):...
1. **简单工厂方法**:工厂类通常包含一个静态工厂方法,如`Calculator createCalculator(String type)`,该方法根据传入的类型参数(如"加法"、"减法"等)返回相应的计算器对象。这样,客户端只需传入所需的运算...