设计模式第二话——工厂模式和抽象工厂模式

今天在慕课上学习了模式的秘密——工厂模式和抽象工厂模式,还需要更加深入地了解。(以下内容整理自慕课网)

传送门:http://www.imooc.com/learn/261

(一)   工厂模式是什么?

实例化对象的时候,我们用工厂方法来代替new操作

工厂模式包括了工厂模式和抽象工厂模式



(二)   工厂模式的意图是什么?

定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化,它将实例化的工作推迟到了子类中去实现。

(三)   什么时候使用工厂模式呢?

有一组类似的对象需要实例化;

在编码时不确定需要创建哪种类的实例;

系统需要考虑扩展性;(譬如,在接下来的开发中,又有新的需求添加进来)

(四)   工厂模式的动机是什么?

在项目中,当一个对象变化时,我们希望依赖于该对象的其他对象不会受到影响。

(五)   工厂模式的代码实现

场景: 画脸蛋

首先,我们定义一个接口,接口中有一个draw方法用于画发型。

public interface HairInterface {
	public void draw();
}

然后添加两个发型类——左发型类和右发型类

public class LeftHair implements HairInterface {

	@Override
	public void draw() {
		System.out.println("左偏分发型");
	}
	
}

public class RightHair implements HairInterface {

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("右偏分发型");
	}

}


我们想给这些发型类一个统一个管理,那么定义一个HairFactory 工厂类。在这个工厂类中对不同发型类的实例化进行统一的管理,根据用户的选择进行实例化。具体是通过类的getInstance()方法来实现的,同时注意这一方法要有try catch语句来避免找不到类的情况。

/*
 * 根据需求创建发型对象
 */
public class HairFactory {
	public HairInterface getHair(String className) {
		
		try {
			HairInterface hair = (HairInterface) Class.forName(className).newInstance();
			return hair;
		} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
			e.printStackTrace();
		}
		throw new RuntimeException();
		
	}
}


(六)   抽象工厂模式的代码实现

首先,我们定义接口男孩和接口女孩

public interface Boy {
	public void drawBoy();
}
public interface Girl {
	public void drawGirl();
}

然后,定义类圣诞男孩和类新年男孩,类圣诞女孩和类新年女孩,分别实现接口

public class MCBOY implements Boy {

	@Override
	public void drawBoy() {
		System.out.println(" Draw a boy");
	}

}

public class MCGirl implements Girl {

	@Override
	public void drawGirl() {
		System.out.println(" Draw a girl");
	}
	
}

public class NYBoy implements Boy {

	@Override
	public void drawBoy() {
		System.out.println("draw a NYBoy");
	}

}

public class NYGirl implements Girl {

	@Override
	public void drawGirl() {
		System.out.println("draw a NYGirl");
	}

}
接着,不管是男孩女孩,定义一个工厂总管理接口

public interface PrrsonFactory {
	public Boy getBoy();
	public Girl getGirl();
}

然后,定义圣诞工厂类和新年工厂类,实现总的工厂接口,来作为具体的工厂类管理工具

public class MCFactory implements  PrrsonFactory{

	@Override
	public Boy getBoy() {
		// TODO Auto-generated method stub
		return new MCBOY();
	}

	@Override
	public Girl getGirl() {
		// TODO Auto-generated method stub
		return new MCGirl();
	}

}

public class NYFactory implements PrrsonFactory{
	@Override
	public Boy getBoy() {
		// TODO Auto-generated method stub
		return new NYBoy();
	}

	@Override
	public Girl getGirl() {
		// TODO Auto-generated method stub
		return new NYGirl();
	}
}

这样就实现了上面的抽象工厂模式图。

(七)   常见应用




(八)   总结

从以上我们可以看出,抽象工厂模式可以看成是工厂模式的推广,而工厂模式是抽象工厂模式的一个极端情况。

工厂模式是用来创建一个产品的等级结构,抽象工厂模式可以用来创建多个产品的等级结构。

工厂模式只有一个抽象产品类,抽象工厂模式有多个抽象产品类。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值