自我成长之简单工厂模式

简单工厂的应用场景

工程中需要用到复杂对象的,像电脑,分为苹果,戴尔,联想等,每个电脑的品牌不同,系统不同。

简单工厂的示例


  • 创建一个电脑的抽象类,定义电脑的一些共有的属性,如开机启动,一些特有的属性通过抽象方法实现如系统,品牌等

/**
 * <pre>
 * 项目名称:ModeNote   
 * 类名称:Computer 类,抽象产品类,具体的实现细节通过子类实现  
 * 类描述:   
 * 创建人:bd_liang   
 * 创建时间:Feb 17, 2017 3:40:56 PM   
 * 修改人:bd_liang   
 * 修改时间:Feb 17, 2017 3:40:56 PM   
 * 修改备注:
 * @version 1.0
 * 
 * <pre>
 */

public abstract class Computer {
	/**
	 * 获取电脑的系统
	 */
	public abstract void getOS();

	/**
	 * 获取电脑的品牌
	 */
	public abstract void getBrand();

	/**
	 * 开机
	 */
	public void start(String param) {
		System.out.println("------" + param + "启动了-----");
	}

}
  • 创建一些特有的属性通过接口实现,(抽象类与接口的区别就是共有的通过抽象方法,特有的通过接口),表述不是很确切,就想有的电脑都需要有系统、主机等,只是品牌不同,但有的电脑有CD驱动,有的没有。系统、主机的属性可以通过抽象类定义,子类定义具体的操作系统或者型号以及是否需要安装CD驱动(是否实现该接口)。
/**
 * <pre>
 * 项目名称:ModeNote   
 * 类名称:ICDDriver   
 * 类描述:光驱接口   
 * 创建人:bd_liang   
 * 创建时间:Feb 17, 2017 3:30:38 PM   
 * 修改人:bd_liang   
 * 修改时间:Feb 17, 2017 3:30:38 PM   
 * 修改备注:1.0
 * @version
 * 
 * <pre>
 */

public interface ICDDriver {
	/**
	 * 播放CD
	 */
	public void playCD();
}

  • 创建具体的产品类A:戴尔电脑。
/**
 * <pre>
 * 项目名称:ModeNote   
 * 类名称:DellComputer ,具体的产品类  
 * 类描述:   
 * 创建人:bd_liang   
 * 创建时间:Feb 17, 2017 3:46:55 PM   
 * 修改人:bd_liang   
 * 修改时间:Feb 17, 2017 3:46:55 PM   
 * 修改备注:
 * @version 1.0
 * 
 * <pre>
 */

public class DellComputer extends Computer implements ICDDriver {
	/*
	 * (non-Javadoc)
	 * 
	 * @see com.study.factory.Computer#getOS()
	 */
	@Override
	public void getOS() {
		// TODO Auto-generated method stub
		System.out.println("OS:: Windows");
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.study.factory.Computer#getBrand()
	 */
	@Override
	public void getBrand() {
		// TODO Auto-generated method stub
		System.out.println("Banrd::Dell ");
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.study.factory.ICDDriver#playCD()
	 */
	@Override
	public void playCD() {
		// TODO Auto-generated method stub
		System.out.println("play the CD! ");
	}

}

  • 创建具体的产品类B:苹果电脑。
/**
 * <pre>
 * 项目名称:ModeNote   
 * 类名称:MacComputer   ,具体的产品类
 * 类描述:   
 * 创建人:bd_liang   
 * 创建时间:Feb 17, 2017 3:52:24 PM   
 * 修改人:bd_liang   
 * 修改时间:Feb 17, 2017 3:52:24 PM   
 * 修改备注:
 * @version
 * 
 * <pre>
 */

public class MacComputer extends Computer {

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.study.factory.Computer#getOS()
	 */
	@Override
	public void getOS() {
		// TODO Auto-generated method stub
		System.out.println("OS:: Mac");
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.study.factory.Computer#getBrand()
	 */
	@Override
	public void getBrand() {
		// TODO Auto-generated method stub
		System.out.println("Brand :: 苹果");
	}

}

  • 创建电脑生产厂家,简单工厂模式直接根据传入的参数生产相应的品牌电脑,不创建抽象工厂类,在根据不同的品牌去创建不同的产品工厂了。实际的需求应该是定义一个抽象工厂(泛型),苹果厂商、戴尔厂商分别是不同的生产工厂。。。
/**
 * <pre>
 * 项目名称:ModeNote   
 * 类名称:ComputerFactory   
 * 类描述: 电脑工厂  
 * 创建人:bd_liang   
 * 创建时间:Feb 17, 2017 3:55:47 PM   
 * 修改人:bd_liang   
 * 修改时间:Feb 17, 2017 3:55:47 PM   
 * 修改备注:
 * @version 1.0
 * 
 * <pre>
 */

public class ComputerFactory {
	/**
	 * 利用反射机制,根据传入的参数生产具体的产品,不用每增加一个产品,就添加一个生产产品的方法
	 * 
	 * @param clz
	 * @return
	 */
	public static <T extends Computer> T getComputer(Class<T> clz) {
		Computer computer = null;
		try {
			computer = (Computer) Class.forName(clz.getName()).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();
		}
		return (T) computer;

	}
}

创建一个测试类,具体的应用实现

/**
 * <pre>
 * 项目名称:ModeNote   
 * 类名称:Test   
 * 类描述:   
 * 创建人:bd_liang   
 * 创建时间:Feb 17, 2017 4:01:46 PM   
 * 修改人:bd_liang   
 * 修改时间:Feb 17, 2017 4:01:46 PM   
 * 修改备注:
 * @version
 * 
 * <pre>
 */

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DellComputer dellComputer = ComputerFactory
				.getComputer(DellComputer.class);

		dellComputer.start(DellComputer.class.getSimpleName());
		dellComputer.getBrand();
		dellComputer.getOS();
		dellComputer.playCD();

		MacComputer macComputer = ComputerFactory
				.getComputer(MacComputer.class);
		macComputer.start(MacComputer.class.getSimpleName());
		macComputer.getBrand();
		macComputer.getOS();

	}

}


测试结果如下:

------DellComputer启动了-----
Banrd::Dell 
OS:: Windows
play the CD! 
------MacComputer启动了-----
Brand :: 苹果
OS:: Mac

以上是自己对简单工厂的理解,例子不是很恰当,但是自己主要是想跟抽象工厂进行区分,后面还是电脑为例,进行抽象工厂的自我理解学习。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值