【设计模式系列】--简单工厂模式

简介: 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。简单来说,通过专门定义一个类来辅助创建其他类的实例,被创建的实例通常都具有共同的父类,今天这篇博文,小编主要简单的介绍一下简单工程模式,通过简单的demo一步一步进行讲解,希望对有需要的小伙伴有帮助,还请小伙伴们多多指教。首先,我们来看一下简单工厂的uml图,如下所示:

接着,小编结合一个简单的demo,来更好的帮助小伙伴们理解简单工厂模式,首先我们新建一个java项目,取名为SimpleFactory,新建三个类Apple、Banana、MainClass,代码分别如下所示:

Apple类的代码:

public class Apple {
	/**
	 * 采集
	 */
	public void get(){
		System.out.println("采集苹果");
	}

}
Banana类的代码:

public class Banana {
	/**
	 * 采集
	 */
	public void get(){
		System.out.println("采集香蕉");
	}

}
编写MainClass里面的代码,如下所示:
public class MainClass {

	public static void main(String[] args){
		//实例化一个Apple
		Apple apple = new Apple();
		//实例化一个Banana
		Banana banana = new Banana();
		
		apple.get();
		banana.get();
		
		
	}
}
运行,效果如下所示:


我们的代码是否还可以进行优化呢?通过Apple类和Banana类我们可以发现,她们都具有get方法,更重要的是,她们都属于水果,所以这个时候,我们可以抽象出来一个接口,so,我们创建一个接口,代码如下所示:

public interface Fruit {
	/**
	 * 采集
	 */
	public void get();
	
}
Apple类和Banana类分别实现接口Fruit,注释掉之前MainClass里面的代码,重新编写,这样,我们这里就用到了多态,代码如下所示:

public class MainClass {

	public static void main(String[] args){
//		//实例化一个Apple
//		Apple apple = new Apple();
//		//实例化一个Banana
//		Banana banana = new Banana();
//		
//		apple.get();
//		banana.get();
		
		//实例化一个Aplle和Banana,用到了多态
		Fruit apple = new Apple();
		Fruit banana = new Banana();
		apple.get();
		banana.get();
		
		
	}
}
运行,效果如下所示:


接着,我们回过头来看一下简单工厂模式的概念,通过专门定义一个类来辅助辅助创建其她类的实例,被创建的实例通常都具有共同的父类,从上面的demo中,我们可以看出来,Apple类和Banana类具有一个共同的父类,那就是Fruit,这个时候,我们需要专门定义一个类来辅助创建其她类的实例,接着,我们再来进行优化,创建一个类FruitFactory,代码如下所示:

public class FruitFactory {
	/**
	 * 获得Apple类的实例
	 */
	
	public static Fruit getApple(){
		return new Apple();
	}
	
	/**
	 * 获得Banana类的实例
	 */
	public static Fruit getBanana(){
		return new Banana();
	}
}
编写main里面的代码,如下所示:

public class MainClass {

	public static void main(String[] args){
//		//实例化一个Apple
//		Apple apple = new Apple();
//		//实例化一个Banana
//		Banana banana = new Banana();
//		
//		apple.get();
//		banana.get();
		
//		//实例化一个Aplle和Banana,用到了多态
//		Fruit apple = new Apple();
//		Fruit banana = new Banana();
//		apple.get();
//		banana.get();

		//实例化一个Apple
		Fruit apple = FruitFactory.getApple();
		Fruit banana = FruitFactory.getBanana();
		apple.get();
		banana.get();
		
	}
}
运行一下,效果如下所示:


这样,我们实现了专门定义一个类来辅助创建其她类的实例,那我们还能不能进一步进行优化呢?答案是肯定的,我们可以把这些方法写成一个静态的方法,我们直接可以通过类名类进行引用,不需要创建工程类的实例,我们来看一下模式中包含的角色及其职责。

a、工厂角色---Creator

简单工厂模式的核心,她负责实现创建所有实例的内部逻辑,工厂类可以被外界直接调用,创建所需要的产品对象。

b、抽象角色--Product

简单工厂模式所创建的所有对象的父类,她负责描述所有实例所共有的公共接口。

c、具体产品角色--Concrete Product

简单工厂模式所创建的具体实例对象

那么,工厂还能否进行进一步的优化呢?yes,我们发现工厂里面分别单独getApple和getBanana,我们是否能写一个公共的getFruit的方法呢?进行优化,编写FruitFactory里面的代码,如下所示:

public class FruitFactory {
//	/**
//	 * 获得Apple类的实例
//	 */
//	
//	public static Fruit getApple(){
//		return new Apple();
//	}
//	
//	/**
//	 * 获得Banana类的实例
//	 */
//	public static Fruit getBanana(){
//		return new Banana();
//	}
	/**
	 * get方法,获得所有产品对象
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException {
		if(type.equalsIgnoreCase("apple")) {
			return Apple.class.newInstance();
		}else if(type.equalsIgnoreCase("banana")){
			return Banana.class.newInstance();
		}else{
			System.out.println("找不到相关实例化类");
			return null;
			
		}
	}
	
}
编写MainClass的代码,如下所示:

public class MainClass {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException{
//		//实例化一个Apple
//		Apple apple = new Apple();
//		//实例化一个Banana
//		Banana banana = new Banana();
//		
//		apple.get();
//		banana.get();
		
//		//实例化一个Aplle和Banana,用到了多态
//		Fruit apple = new Apple();
//		Fruit banana = new Banana();
//		apple.get();
//		banana.get();

//		//实例化一个Apple
//		Fruit apple = FruitFactory.getApple();
//		Fruit banana = FruitFactory.getBanana();
//		apple.get();
//		banana.get();
		
		Fruit apple = FruitFactory.getFruit("apple");
		Fruit banana = FruitFactory.getFruit("banana");
		apple.get();
		banana.get();
		
		
	}
}
运行,效果如下所示:


我们知道,每一种模式都是经过不断的改进,最后达到业内都能接受的一种规范,so,我们还可以进行优化,编写FruitFactory的内容,如下所示:

public class FruitFactory {
//	/**
//	 * 获得Apple类的实例
//	 */
//	
//	public static Fruit getApple(){
//		return new Apple();
//	}
//	
//	/**
//	 * 获得Banana类的实例
//	 */
//	public static Fruit getBanana(){
//		return new Banana();
//	}
	/**
	 * get方法,获得所有产品对象
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 * @throws ClassNotFoundException 
	 */
	public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
//		if(type.equalsIgnoreCase("apple")) {
//			return Apple.class.newInstance();
//		}else if(type.equalsIgnoreCase("banana")){
//			return Banana.class.newInstance();
//		}else{
//			System.out.println("找不到相关实例化类");
//			return null;
//			
//		}
		Class fruit = Class.forName(type);
		return (Fruit) fruit.newInstance();
	}
	
}
编写MainClass的代码,如下所示:

public class MainClass {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
//		//实例化一个Apple
//		Apple apple = new Apple();
//		//实例化一个Banana
//		Banana banana = new Banana();
//		
//		apple.get();
//		banana.get();
		
//		//实例化一个Aplle和Banana,用到了多态
//		Fruit apple = new Apple();
//		Fruit banana = new Banana();
//		apple.get();
//		banana.get();

//		//实例化一个Apple
//		Fruit apple = FruitFactory.getApple();
//		Fruit banana = FruitFactory.getBanana();
//		apple.get();
//		banana.get();
		
		Fruit apple = FruitFactory.getFruit("Apple");
		Fruit banana = FruitFactory.getFruit("Banana");
		apple.get();
		banana.get();
		
		
	}
}
运行一下,效果如下所示:


接着,我们来看一下简单工厂模式的优缺点:

在这个模式中,工厂类是整个模式的关键所在,她包含的必要的判断楼哦机,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象,用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的,有利于整个廉体系结构的优化。

不难发现,简单工厂模式的确定也正体现在其工厂类上,由于工厂类几种了所有实例的创建逻辑,所以“高内聚”方面做的并不好,另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性不是很好,如下代码:

public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		if(type.equalsIgnoreCase("apple")) {
			return Apple.class.newInstance();
		}else if(type.equalsIgnoreCase("banana")){
			return Banana.class.newInstance();
		}else{
			System.out.println("找不到相关实例化类");
			return null;
			
		}
		Class fruit = Class.forName(type);
		return (Fruit) fruit.newInstance();
	}

如果这个时候再添加一个橙子,so我们需要添加一个else if来进行判断,下面那种方法会解决我们的问题,但是也不能从根本上解决问题,我们调用的时候会比较麻烦,因为这个类你必须知道,对于客户而言,是比较麻烦的,一般我们会受用第二种,不用考虑大小写,虽然第三种扩展性好,但是适用性较差。

小编寄语:该博文,小编主要简单的介绍了简单工厂模式,通过一个简单的demo进行讲解,简单工厂模式是属于创建型模式,又叫做静态工厂方法模式,但不属于二十三中GOF设计模式之一,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一种特殊实现,想起那句话,编程是一门技术,更是一门艺术,在编写代码的过程中,要牢记可复用、易维护、好扩展,这样,自己才能有所提高,才是真正的软件工程师。

目录
相关文章
|
18天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
20天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
13天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
33 1
|
1月前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
21 3
|
2月前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
2月前
|
设计模式 Java Spring
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)
|
2月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
35 0