Java设计模式——简单工厂模式

引言:工厂模式是最常见的一类创建型设计模式,它包括以下三种具体的设计模式:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

我们通常所说的工厂模式是指工厂方法模式,它是使用频率最高的工厂模式,而简单工厂模式相当于工厂方法模式的“小弟”,它并不属于23种经典设计模式,但是它的设计思想相对简单,通常将它作为学习其他工厂模式的基础,此外,工厂方法模式还有一位“大哥”——抽象工厂模式,它是工厂模式中难度最高的模式。

一、简单工厂模式概述

1. 定义

定义一个工厂类,它可以根据参数的不同,返回不同类的实例,被创建的实例通常都具有共同的父类。

2.设计思想

首先将需要创建的各种不同对象的相关代码封装到不同的类中,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装到一个抽象产品类中,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用来创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同,创建不同的具体产品对象;客户端只需调用工厂类的方法并传入相应的参数,即可得到一个产品对象。

3.功能实现

简单工厂模式主要解决的问题:将实例化具体类的代码从客户端中抽离出来,提供专门的工厂类用于创建对象,将对象的创建和对象的使用分离

二、简单工厂模式实现过程

首先,我们思考如下场景:Mini想去书店买两本书,一本是 The Sea,另外一本是The Little Prince,它的类图如下:

                                        

扫描二维码关注公众号,回复: 5824392 查看本文章
interface Book{
	void printBookName();
}

class TheSea implements Book{
	public void printBookName(){
		System.out.println("This Book is 《The Sea》");
	}
}

class TheLittlePrince implements Book{
	public void printBookName(){
		System.out.println("This Book is 《The Little Prince》");
	}
}

public class Client {
   public void BuyBook(Book book) {
	   book.printBookName();//调用子类具体实现的抽象方法
   }
   public void main(String[] args) {
	   Client client =new Client();
	   client.BuyBook(new TheSea());//实例化具体类
       client.BuyBook(new TheLittlePrince());//实例化具体类

/*
如果此时需要再买一本《The Life》书,就需要再实例化一个TheLife类

         client.BuyBook(new TheLife());
为了实现在不修改任何客户端代码的情况下,更换和增加新的产品类
由此引出了简单工厂模式的概念
*/
   }
}

那么,问题来了,Mini又想买一本名为The life的书,这时我们需要修改客户端代码,实例化一个TheLife类,让客户端支持The life这本书,那么,如何将实例化具体类的代码从客户端中抽离,或者封装起来,使它们不会干扰应用的其他部分呢?

注意:其实我们还需要(在创建一个The Life类接口于Book的基础上),修改工厂类源代码,那么如何实现增加新产品而不影响源代码?工厂方法模式解决了这一问题


这时,我们就可以使用简单工厂模式的思想来实现这一想法:首先创建一个生产书籍的工厂,客户需要买什么样的书,就可以输入书名来获取该书,将类的实例化交给工厂。此时的类图为:

                                  

interface Book{//抽象产品
	void printBookName();//所有产品类的公共业务方法
}

class TheSea implements Book{//具体产品
	public void printBookName(){
		System.out.println("This Book is 《The Sea》");//实现业务方法
	}
}

class TheLittlePrince implements Book{//具体产品
	public void printBookName(){
		System.out.println("This Book is 《The Little Prince》");
	}
}

class BookFactory{       //工厂类
	public static Book getBook(String bookName) {//静态工厂方法,被外部类直接调用
	           Book book=null;
	           if(bookName.equals("TheLittlePrince")) {
	        	   book=new TheLittlePrince();
	           }else if(bookName.equals("TheSea")) {
	        	   book=new TheSea();
	           }
	           return book;
	}	
}
public class Client {
   public void BuyBook(Book book) {
	   book.printBookName();
   }
   public void main(String[] args) {
	   Client client =new Client();
	   Scanner scanner=new Scanner(System.in);
	   System.out.println("请输入您想买的书?");
	   String bookName=scanner.nextLine();
	   Book book=BookFactory.getBook(bookName);//实现对象的创建与对象的使用相分离
	   client.BuyBook(book);
   }
}

在简单工厂模式中,客户端通过工厂类来创建一个产品类的实例,将实例化具体类的代码从客户端中抽离,在不需更改客户端代码的情况下实现增加新的产品类对象。

三、简单工厂方法总结

简单工厂模式包括以下三个角色:

  • 一个工厂:负责实现创建所有产品实例的内部逻辑
  • 抽象产品类:工厂类创建的所有对象的父类,封装了各种产品对象的公共方法
  • 具体产品类:所有被创建的对象都充当某个具体产品类的实例

简单工厂模式提供了专门的工厂类用于创建对象,将对象的创建和对象的使用分离,当你需要什么,只需传入一个参数,就可以获取所需的对象,而无需知道其创建细节。

简单工厂模式优点:

1.工厂类中包含必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的职责

2.客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可

3.在不需要修改任何客户端代码的情况下,更换和增加新的具体产品类,提高了系统的灵活性

简单工厂模式缺点:

1.由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都会受到影响

2.系统扩展困难,一旦添加新的产品就要修改工厂逻辑,在产品类型过多的情况下,造成工厂逻辑过于复杂

3.简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构

猜你喜欢

转载自blog.csdn.net/Racheil/article/details/88774817