【GoF】工厂方法-再理解

       在drp时运用到了工厂方法设计模式,通过简单的小例子,对其也有了更清楚的了解。之前对于工厂方法的理解,只是局限于定义,对于代码如何操作很难懂。这次在drp上老师一点点讲述关于简单工厂与工厂方法的使用时,才渐渐理清楚了思路。

       工厂方法是将创建细节隐藏,从而使产品改变不会对客户造成影响。如下图:


电视接口

public interface TV {
	public void turnOn();
	public void turnOff();
}


具体电视类

public class ChangHongTV implements TV {

	@Override
	public void turnOn() {
		System.out.println("ChangHongTV.turnOn()");
	}

	@Override
	public void turnOff() {
		System.out.println("ChangHongTV.turnOff()");
	}

}

package com.bjpowernode.pattern;

public class HaiErTV implements TV {

	@Override
	public void turnOn() {
		System.out.println("HaierTV.turnOn()");
	}

	@Override
	public void turnOff() {
		System.out.println("HaierTV.turnOff()");
	}

}

public class HaiXinTV implements TV {

	@Override
	public void turnOn() {
		System.out.println("HaiXinTV.turnOn()");
	}

	@Override
	public void turnOff() {
		System.out.println("HaiXinTV.turnOff()");
	}

}

       一般情况下,我们使用具体的电视,会通过接口取实例化具体电视,从而当我们在其他地方改变时造成改动,违背了OCP原则(开放封闭原则)。而这时候使用工厂的原因,在于,工厂可以实现隐藏电视的集体创建,将电视的具体创建交由工厂,当我们需要某种电视时,只需要交给某种电视的创建工厂去创建即可。下面是工厂类

工厂接口

//采用工厂将产品创建细节隐藏
//这样产品发生改变不会对客户造成影响
public interface TVFactory {
	public TV  createTV();
}


具体工厂类

public class TVFactoryChangHong implements TVFactory {

	@Override
	public TV createTV() {
		//构造长虹的电视
		//.....
		//......
		//......
		return new ChangHongTV();
	}

}

public class TVFacotryHaiXin implements TVFactory {

	@Override
	public TV createTV() {
		//构造长虹的电视
		//.....
		//......
		//......
		return new HaiXinTV();
	}

}

public class TVFactoryHaiEr implements TVFactory {

	@Override
	public TV createTV() {
		//构造长虹的电视
		//.....
		//......
		//......
		return new HaiErTV();
	}

}


       这时候,在其它地方,我们使用时,就仅需要调用工厂去创建具体的电视工厂即可。例如:

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//实例化创建海尔电视的工厂
		TVFactory factory = new TVFactoryHaiEr();
		TV tv = factory.createTV();
		tv.turnOn();
		//实例化创建长虹电视的工厂
		factory = new TVFactoryChangHong();
		tv = factory.createTV();
		tv.turnOn();
		//实例化创建海信电视的工厂
		factory = new TVFacotryHaiXin();
		tv = factory.createTV();
		tv.turnOn();
	}

}

       当我们仍旧需要其他电视类型的时候,只需要田间一个相应的具体电视工厂类,以及一个具体的电视类即可,这样就实现了对修改封闭,对扩展开放。

        但是工厂方法仍旧有不足,工厂方法只是针对单一系列产品实现开放原则,但是对于不同系列的产品仍旧违背这一原则,所以,有了后来的抽象工厂模式。请等下次分享!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值