java 设计模式之抽象工厂

苦逼的IT男睡不着,就写点东西.........

介绍JAVA设计模式之抽象工厂

抽象工厂主要是用在替换一个系列产品,类有点多,主要是写了抽象类用在扩展方面,还有就是在JDK 1.5后的枚举ENUM的应用,以及自己的一些经验.....

不多说,直接上原码,原码注解很清楚

1.首先建一个程序员类

package com.wonder.designPattern.abstractFactory;

/**
 * 干IT的,都比较苦逼啊</br>
 * 程序员.....</br>
 * @author wonder
 *
 * @time 2013-6-20 上午12:49:52
 */
public interface Programmer {
	
	/**
	 * 程序员一般睡觉很晚,就像现在苦逼的我一样!!!
	 */
	public void sleep();
	
	/**
	 * 程序员工作都很苦逼...
	 */
	public void work();
	
	/**
	 * 不同的城市待遇不一样
	 */
	public void treatment();
	
	
}

2.成都程序员类

package com.wonder.designPattern.abstractFactory;

/**
 * 成都程序员</br>
 * 定义为抽象类 ABSTRACK CLASS,</br>
 * 主要是因为定义接口时没定义性别(故意为之),不允许你NEW出来</br>
 * 虽然这行业女生很少</br>
 * 现在还来得及,可扩展....
 * @author wonder
 *
 * @time 2013-6-20 上午12:57:40
 */
public abstract class ChengDuProgrammer implements Programmer{

	@Override
	public void sleep() {
		// TODO Auto-generated method stub
		System.out.println("成都的程序员睡觉很晚......");
	}

	@Override
	public void treatment() {
		// TODO Auto-generated method stub
		System.out.println("成都的程序员工资低......");
	}

	@Override
	public void work() {
		// TODO Auto-generated method stub
		System.out.println("成都的程序员工作很苦逼.....");
	}
	
}

3.深圳程序员类

package com.wonder.designPattern.abstractFactory;

/**
 * 深圳的程序员
 * @author wonder
 *
 * @time 2013-6-20 上午01:05:00
 */
public abstract class ShenZhengProgrammer implements Programmer{

	@Override
	public void sleep() {
		// TODO Auto-generated method stub
		System.out.println("深圳的程序员睡觉晚....");
	}

	@Override
	public void treatment() {
		// TODO Auto-generated method stub
		System.out.println("深圳程序员待遇比较高....");
	}

	@Override
	public void work() {
		// TODO Auto-generated method stub
		System.out.println("深圳的程序员工作也苦逼......");
	}

}

4.程序员呢有性别 先成都的吧 成都IT男

package com.wonder.designPattern.abstractFactory;

/**
 * 男的程序员就苦逼了
 * @author wonder
 *
 * @time 2013-6-20 上午01:15:37
 */
public class CDMaleProgrammer extends ChengDuProgrammer{
	
	public void sex(){
		System.out.println("成都苦逼IT男....");
	}
}

5.成都IT女

package com.wonder.designPattern.abstractFactory;

/**
 * 女的程序员在公司是抢手货啊....
 * @author wonder
 *
 * @time 2013-6-20 上午01:14:27
 */
public class CDFemaleProgrammer extends ChengDuProgrammer{
	
	public void sex(){
		System.out.println("成都IT女....");
	}
}

6.深圳IT男

package com.wonder.designPattern.abstractFactory;

/**
 * 不管在哪,男的还是苦逼...
 * @author wonder
 *
 * @time 2013-6-20 上午01:22:38
 */
public class SZMaleProgrammer extends ShenZhengProgrammer{
	
	public void sex(){
		System.out.println("深圳苦逼IT男...");
	}
}

7.深圳IT女

package com.wonder.designPattern.abstractFactory;

/**
 * 不管在哪,女的都抢手啊
 * @author wonder
 *
 * @time 2013-6-20 上午01:21:22
 */
public class SZFemaleProgrammer extends ShenZhengProgrammer{
	
	public void sex(){
		System.out.println("深圳IT女....");
	}
}
8.程序员枚举类

package com.wonder.designPattern.abstractFactory;

/**
 * 在此处引用了枚举</br>
 * 按需求定义所有的程序员</br>
 * 顺便解释下枚举:</br>
 * 在JDK 1.5 后引入进来的,用起来可以感觉和普通类中定义的静态变量差不多......</br>
 * 但在WEB项目中,如果要修改变量,直接用编译好的枚举类替换却不用重启服务器</br>
 * 这是定义静态变量普通类所做不到的.....
 * 
 * @author wonder
 *
 * @time 2013-6-20 上午01:25:07
 */
public enum ProgrammerEnum {
	
	//定义所有的程序员
	CDMaleProgrammer("com.wonder.designPattern.abstractFactory.CDMaleProgrammer"),
	
	CDFemaleProgrammer("com.wonder.designPattern.abstractFactory.CDFemaleProgrammer"),
	
	SZMaleProgrammer("com.wonder.designPattern.abstractFactory.SZMaleProgrammer"),
	
	SZFemaleProgrammer("com.wonder.designPattern.abstractFactory.SZFemaleProgrammer");
	
	private String value = "";
	
	/**
	 * 定义构造函数,注意是PRIVATE
	 * @param value
	 */
	private ProgrammerEnum(String value){
		this.value = value;
	}
	
	/**
	 * 获取枚举类型中一个元素的值
	 * @return VALUE
	 */
	public String getValue(){
		return this.value;
	}
}

9.程序员工厂

package com.wonder.designPattern.abstractFactory;

/**
 * 程序员工厂,招聘程序员
 * @author wonder
 *
 * @time 2013-6-20 上午01:43:43
 */
public interface ProgrammerFactory {
	
	/**
	 * 在成都招聘程序员
	 * @return PROGRAMMER
	 */
	public Programmer createChengDuProgrammer();
	
	/**
	 * 在深圳招聘程序员
	 * @return PROGRAMMER
	 */
	public Programmer createShenZhengProgrammer();
}

10.抽象工厂

package com.wonder.designPattern.abstractFactory;

/**
 * 根据枚举类型招聘程序员
 * @author wonder
 *
 * @time 2013-6-20 上午01:48:35
 */
public abstract class AbstractProgrammerFactory implements ProgrammerFactory{
	
	/**
	 * 按枚举类型招聘程序员
	 * @param programmerEnum
	 * @return PROGRAMMER
	 */
	protected Programmer createProgrammer(ProgrammerEnum programmerEnum){
		
		Programmer programmer = null;
		
		//传进来的是一个定义中的枚举类型就招聘一个程序员
		if(!programmerEnum.getValue().equals("")){
			try {
				programmer = (Programmer) Class.forName(programmerEnum.getValue()).newInstance();
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			System.out.println("你传的类型不正确!!!");
		}
		
		return programmer;
	}
}

11.男性系列工厂

package com.wonder.designPattern.abstractFactory;

/**
 * 招聘男性系列程序员
 * @author wonder
 *
 * @time 2013-6-20 上午01:59:32
 */
public class MaleProgramFactory extends AbstractProgrammerFactory{

	@Override
	public Programmer createChengDuProgrammer() {
		// TODO Auto-generated method stub
		return super.createProgrammer(ProgrammerEnum.CDMaleProgrammer);
	}

	@Override
	public Programmer createShenZhengProgrammer() {
		// TODO Auto-generated method stub
		return super.createProgrammer(ProgrammerEnum.SZMaleProgrammer);
	}

}

12.女生系列工厂

package com.wonder.designPattern.abstractFactory;

/**
 * 招聘女性系列程序员
 * @author wonder
 *
 * @time 2013-6-20 上午02:03:39
 */
public class FemaleProgramFactory extends AbstractProgrammerFactory{

	@Override
	public Programmer createChengDuProgrammer() {
		// TODO Auto-generated method stub
		return super.createProgrammer(ProgrammerEnum.CDFemaleProgrammer);
	}

	@Override
	public Programmer createShenZhengProgrammer() {
		// TODO Auto-generated method stub
		return super.createProgrammer(ProgrammerEnum.SZFemaleProgrammer);
	}

}

13.软件公司招聘程序员

package com.wonder.designPattern.abstractFactory;

/**
 * 软件公司招聘程序员
 * @author wonder
 *
 * @time 2013-6-20 上午02:05:07
 */
public class SoftCompany {
	
	public static void main(String[] args) {
		
		//公司同时招聘男程序员
		ProgrammerFactory maleProgrammerFactory = new MaleProgramFactory();
		
		//公司同时也招聘女程序员
		ProgrammerFactory femaleProgrammerFactory = new FemaleProgramFactory();
		
		//在成都招聘程序员
		CDMaleProgrammer CDProgrammer = (CDMaleProgrammer) maleProgrammerFactory.createChengDuProgrammer();
		
		//在深圳招聘程序员
		SZMaleProgrammer SZProgrammer = (SZMaleProgrammer) maleProgrammerFactory.createShenZhengProgrammer();
		
		/**
		 * 哥在成都呢,所以选择成都苦逼的IT男....
		 */
		CDProgrammer.sleep();
		CDProgrammer.work();
		CDProgrammer.treatment();
		CDProgrammer.sex();
		
		/**
		 * 女的程序员你自己看着办.......
		 * 成都和深圳的由你选......
		 */
	}
}

希望多多交流,有什么好的建议尽管提......

好了,睡觉了.....



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值