设计模式:工厂模式

工厂模式概述

工厂模式(Factory Pattern)解决的是实例化对象的问题,在某些情况下,需要创建的对象的初始化操作十分复杂,放在构造函数中会影响代码的可读性;亦或是待一次性需要实例化的对象太多,直接实例化的代码会重复执行很多次,影响执行的效率,这时候如果定义一个形同工厂的类专门负责对象的实例化创建,便可以增加代码可读性和复用性。在任何需要生成复杂对象的地方,都可以使用工厂模式。

较为简单的对象实例化没必要使用工厂模式,反而会增加系统的复杂度

工厂模式分为三种:

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

简单工厂模式

简单工厂模式,顾名思义是最简单的工厂模式。根据不同的参数,创建不同类型的实例。一般用于在某一大类下不同小类的实例化。工厂有一个方法,专门负责根据传入的参数生成对应的实例。比如一个生产手机的工厂,可以生产安卓和苹果的手机,使用者可以根据需要来使用对象生产相应的手机。

public class SimpleFactory {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MobileFactory mf = createProduct("Apple");
		mf.display();
	}

	//工厂实例化方法
	public static MobileFactory createProduct(String s) {
		if(s.equals("Apple"))
			return new Apple();
		else
			return new Android();
	}
	
}


//抽象工厂类
abstract class MobileFactory {
	public abstract void display();
}


//子类1
class Apple extends MobileFactory{
	public void display() {
		System.out.println("Apple");
	}
}


//子类2
class Android extends MobileFactory{
	public void display() {
		System.out.println("Android");
	}
}

简单工厂模式的优点:

对象创建和使用分离,使用者不必知道怎么创建,直接使用。

缺点:

不够灵活,每新增一个产品就要添加相应的工厂类,逻辑变复杂。

工厂方法模式

工厂方法模式即是将创建实例化的操作推给其子类。比如有一个生产手机的抽象方法,工厂方法模式将生成具体产品的任务分发给具体的手机产品工厂,也就是定义一个抽象工厂,其定义了手机的生产接口,但不负责具体的手机,将生产任务交给不同的手机工厂,负责生产手机的工厂来实例化对象。

//生产手机的工厂类
interface MobilePhoneFactory{
	Phone createPhone();
}


//手机
interface MobilePhone{
	
}
class ApplePhone implements Phone {
	public ApplePhone() {
		System.out.println("Apple");
	}
}

class AndroidPhone implements Phone {
	public AndroidPhone() {
		System.out.println("Android");
	}
}


//生产apple手机的工厂
class AppleFactory implements MobilePhoneFactory{

	@Override
	public Phone createPhone() {
		// TODO Auto-generated method stub
		return new ApplePhone();
	}
}


//生产android手机的工厂
class AndroidFactory implements MobilePhoneFactory{

	@Override
	public Phone createPhone() {
		// TODO Auto-generated method stub
		return new AndroidPhone();
	}
}

工厂方法模式优点:

克服了简单工厂违背开放-封闭原则的缺点。
增加产品时无需修改原先待代码。

缺点

增加一个产品,相应的也要增加一个子工厂,加大额外开销。

抽象工厂模式

简单工厂模式只能针对一类产品(手机),如果想生产另一类完全不同的产品,则可以使用工厂方法模式。工厂方法模式通过在工厂中添加新产品的接口,并在子类中实现新添加的产品的创建。现在此工厂只能生产苹果手机,使用抽象工厂模式,添加生产电脑的接口,工厂便可以同时生产苹果的电脑。

public class AbstractFactory {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SuperFactory sf = new SuperFactory();
		sf.createPC("iMac");
	}

}


//工厂
interface Factory{
	Phone createPhone(String s);
	PC createPC(String s);
}


//具体工厂,负责实例化
class SuperFactory implements Factory{

	@Override
	public Phone createPhone(String s) {
		// TODO Auto-generated method stub
		return new iPhone();
	}

	@Override
	public PC createPC(String s) {
		// TODO Auto-generated method stub
		return new iMac();
	}
	
}


//手机
interface Phone{
	
}
class iPhone implements Phone{
	
	public iPhone() {
		System.out.println("iPhone");
	}
}


//电脑
interface PC{

}
class iMac implements PC{
	
	public iMac() {
		System.out.println("iMac");
	}
}

抽象工厂模式优点:

可以创建多个大类对象,管理方便。
让具体的创建实例过程与客户端分离,不会出现在客户代码中。

缺点:

难以扩展。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值