Java设计模式——工厂方法模式

引言:简单工厂模式虽然简单,但存在一个很严重的问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同,来创建不同的产品,这必定要修改工厂类的源代码(增加一个新产品类,修改静态工厂方法内部逻辑),那么,为了实现增加新产品而不影响已有代码,工厂方法模式应运而生。


一、工厂方法模式概述

1.定义

定义一个用于创建对象的接口,让子类决定将哪一个类实例化,同时让一个类的实例化延迟到其子类

2.实现功能

工厂方法模式主要解决的问题:实现增加新产品而不影响工厂类源代码(抽象工厂类)

3.设计思想

针对不同的产品,提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构,在客户端中判断使用哪个工厂类去创建对象

工厂方法模式提供了一个抽象工厂接口来声明抽象工厂方法,而由子类来具体实现工厂方法,创建具体的产品对象

工厂方法模式结构如图所示:

                                            

工厂方法模式包括以下4个角色:

(1)Project(抽象产品)

它是定义产品的接口,产品对象的公共父类

(2)ConcreteProduct(具体产品)

它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂与具体产品一一对应

(3)Factory(抽象工厂):工厂方法模式的核心

在抽象工厂类中,声明了工厂方法,用于返回一个产品,所有创建对象的工厂类都必须实现该接口

(4)ConcreteFactory(具体工厂)

它是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并可有客户端调用,返回一个具体产品类的实例

二、工厂方法模式实现

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》");
	}
}

interface BookFactory{ //抽象工厂(用于创建对象的接口,让子类决定将哪一个类实例化,类的实例化延迟到子类)
	Book createBook();  
		
}

class FictionBook implements BookFactory{     //具体工厂
	public Book createBook() {
		return new TheSea();
	}
	
}
class LiterBook implements BookFactory{     //具体工厂
	public Book createBook() {
		return new TheLittlePrince ();
	}
}

public class Client {
   public void BuyBook(Book book) {
	   book.printBookName();
   }
   public void main(String[] args) {
	   Client client =new Client();
	   BookFactory factory=new FictionBook();//判断使用哪个工厂类创建对象
	   client.BuyBook(factory.createBook());
   }
}

1.工厂方法模式针对每个产品提供一个工厂类,在客户端中判断使用哪个工厂类去创建对象

2.在客户端代码中,只需要关心抽象工厂类即可,不同的具体工厂可以创建不同的产品

3.如果想要增加一个TheLife具体产品类,此时就不需要修改工厂类源代码,而是新增一个具体工厂类接口于抽象工厂类(不可以在现有具体工厂类中修改逻辑)

三、工厂方法模式总结

工厂方法模式是简单工厂模式的延伸,它继承了简单工厂模式的优点,弥补了简单工厂模式的不足,工厂方法模式是使用频率最高的设计模式之一

优点:

1.具体工厂方法用来创建客户所需要的产品,同时还向客户隐藏了那种具体产品类将被实例化,用户只需要关心所需产品对应的工厂即可

2.工厂方法模式基于工厂角色和产品角色的多态性设计,它能够让工厂可以自主确定创建何种产品对象

3.加入新产品时,不需要修改抽象工厂,抽象产品,客户端,只要添加一个具体工厂类和具体产品即可,提升系统可扩展性

缺点:

1.引入了抽象层,增加系统实现难度

2.增加新产品时,需要提供与之对应的具体工厂类,给系统带来额外开销

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值