苦逼的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();
/**
* 女的程序员你自己看着办.......
* 成都和深圳的由你选......
*/
}
}
希望多多交流,有什么好的建议尽管提......
好了,睡觉了.....