《设计模式》之工厂方法模式

107 阅读1分钟

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推辞到子类。


《设计模式》之工厂方法模式


类型:

创建型


适用场景:

创建对象需要大量重复的代码

一个类通过其子类来指定要创建的对象


优点:

加入新产品不需要修改代码,提高了可扩展性

客户无需关注细节,只需关心所对应产品工厂


缺点:

类的个数容易过多增加复杂度

增加系统抽象与理解难度

添加产品时,还需要添加具体的工厂类


代码实现

首先要生产的产品类

如生产手机,定义各个手机厂商的手机产品类即可

首先定义一个手机接口Phone.java(目的是对各个手机产品形成规范,对外提供统一的接口)

interface Phone {  
public void produce();}


定义具体产品并实现Phone接口

HuaweiPhone.java 华为手机

public class HuaweiPhone implements Phone {    
@Override    public void produce() {        
System.out.println("生产华为手机");        
}}


Iphone.java 苹果手机

public class Iphone implements Phone{    
@Override    public void produce() {        
System.out.println("produce iphone");        
}}


定义PhoneFactory.java 产品工厂


public abstract class PhoneFactory {   public abstract Phone makePhone();}


将创建对象延迟到子类

HuaweiPhoneFactory.java 华为手机工厂

public class HuaweiPhoneFactory extends PhoneFactory{    
@Override    public Phone makePhone() {        
return new HuaweiPhone();    
}}


IPhoneFactory.java 苹果手机工厂

class IPhoneFactory extends PhoneFactory{   
 @Override    public Phone makePhone() {        
return new Iphone();    }}


客户端调用

public class Client {    
public static void main(String[] args) {        
PhoneFactory phone =new HuaweiPhoneFactory();        
 phone.makePhone().produce();        
}}

可以看到客户端调用时只需要调用具体的工厂即可,修改时改变工厂即可。我们只需要关心具体的工厂而不需要关心其内部实现。同时也符合了开闭原则(不修改工厂内部的源码实现)。


UML类图

《设计模式》之工厂方法模式
微信公众号

公众号