简单工厂模式简单实例

简单工厂模式简单实例


最近在看设计模式,那么简单工厂模式是什么呢?
简单的例子来记录下吧:
首先来两个例子来简单的说明吧:

1.第一个例子

简单的假设,我们现在需要创建很多的实例,并且这些实例是有一定共性的。
简单例子:现在我们需要创建一个关于usb的设备,只要支持usb的设备我们都需要将其创建出来,比如手机,电脑,相机很多很多种不同的设备,他们有一些共性(属于电子产品,支持usb接口等)那么我们创建这些产品的实例的时候我们会怎么创建呢?

一般创建方法

	public static void main(String [] args){
		//创建电脑实例
		Computer comp = new Computer();
		//创建手机实例
		Phone p = new Phone();
		//创建打印机实例
		Printer prin = new Printer();
		//创建鼠标实例
		Mouse mouse = new Mouse();

	}

在我们创建的过程中就会感觉非常的臃肿,当然简单工厂的设计模式并不是仅仅只是解决这么一个非常小的问题。

我们细细的想,这些产品它是有很多共性的,但是有些东西使他们特有的,那么我们可以怎么做?

这里我们就需要将这些具有共性的东西抽离出来形成一个父类(当然是要用到面向对象的思想的)

这样做的好处?

  1. 对于用户来说:现在有一个例子,我们现在有一个工厂(一个制造电子产品的工厂),他能够给我们制造出支出usb的设备,那么作为一个客户我们不需要去知道工厂具体怎么去操作,我们只要有需求就可以向工厂提交我们需要制造的产品就可以。
  2. 对于工厂来说:我们需要的是满足客户的需求制造出产品,那么工厂有非常多的生产线,我们需要将每一个生产线能够生产什么东西罗列出来,然后分类,但是他们都有支持usb产品的属性,那么就让这些继承产品这个类,作为子类。(这样我们某一条生产线发生了改变,比如iphone6上市后,后面产品的迭代需要更新iphone7,那么我们只需要更改一个产品线就可以,其他的所有东西都可以不需要改变)

那么下面就是简单的代码笔记:

下面这个例子:一个工厂生产出支持usb的电子产品,那么有电脑和鼠标,简单的例子

运用简单工厂设计模式(这个是工厂方法,负责对产品进行实例化)
/**
 * 这是简单工厂模式的工厂类,主要是用来创建其他电子产品的实例的
 * @author lijunhong
 *
 */
public class ElectronFactory {
	USBElectron device = null;//这个是设备
	
	public  USBElectron creatDevice(String name){
		switch (name) {
		case "computer":
			device = new Computer(name);
			break;
		case "mouse":
			device = new Mouse(name);
			break;
		default:
			break;
		}
		return device;
	}
	
}
这个抽象类将产品中的功能抽象出来,每个产品都有相应的功能
/**
 * 这是一个父类,将支持usb中的设备抽象出来
 * @author lijunhong
 *
 */
public abstract class USBElectron {
	
	public abstract void function();//抽象出设备的功能
}
电脑类,继承自上面的父类,并且实现了产品的功能
public class Computer extends USBElectron {
	private String name;
	
	public Computer(String name){
		this.name = name;
	}
	

	public void function() {
		//这个方法是电脑的方法
		System.out.println(this.name+":电脑可以上网,聊天,学习");
	}

}
鼠标类:
	public class Mouse extends USBElectron {
	private String name;
	public Mouse(String name){
		this.name = name;
	}
	
	@Override
	public void function() {
		//这个是鼠标的方法
		System.out.println(this.name+":鼠标可以打字");
	}

}

上面这几个类简单的构成了简单工厂模式;
那么现在开始运用这个简单工厂模式生产产品

当一个客户需要生产产品比如:一台电脑或者一个鼠标亦或者其他东西我们都可以运用

客户端程序
	public class FactoryMain {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//简单工厂创建实例演示
		//创建工厂
		ElectronFactory factory = new ElectronFactory();
		//创建电脑实例
		USBElectron computer = factory.creatDevice("computer");
		computer.function();
		//创建鼠标实例
		USBElectron mouse = factory.creatDevice("mouse");
		mouse.function();
	}

}

2.第二个例子

例子:现在我们需要做一个游戏,这个游戏中有很多怪物,不同种类的怪物,我们根据游戏的进展需要去除案件不同的怪物。(妖猴,狐狸精,狸猫,吸血鬼等)

下面就是离子的实现过程:

怪物的父类(Monster)
//这是一个怪物的抽象类(父类)
public abstract class Monster {
	
	public abstract void skill();//怪物技能
	
	public abstract void getName();//怪物名字
	
	public abstract void eat();//怪物吃东西
}

猴子的实现类(Monkey)
	public class Monkey extends Monster {

		public Monkey(){
			
		}
		
		@Override
		public void skill() {
			System.out.println("猴子会使用金箍棒。");
		}
	
		@Override
		public void getName() {
			System.out.println("猴子");
		}
	
		@Override
		public void eat() {
			System.out.println("猴子吃桃子");
		}
	
		public void life(){
			System.out.println("猴子长身不老");
		}

}

狸猫的实现类(Tanuki)
	public class Tanuki extends Monster {

			public Tanuki(){
				
			}
			
			@Override
			public void skill() {
				System.out.println("狸猫的魅惑技能");
			}
		
			@Override
			public void getName() {
				System.out.println("狸猫");
			}
		
			@Override
			public void eat() {
				System.out.println("狸猫吃太子");
			}
	
}

吸血鬼的实现类(Vampire)
	public class Vampire extends Monster {

			public Vampire(){
				
			}
			
			@Override
			public void skill() {
				System.out.println("吸血鬼吸血");
			}
		
			@Override
			public void getName() {
				System.out.println("吸血鬼");
			}
		
			@Override
			public void eat() {
				System.out.println("吸血鬼吸血");
			}

}

客户端
	public class MonsterMain {

		public static MonsterFactory monsterfactory;//工厂
		public static Monster monster;
		
		public static void main(String[] args) {
			
			//创建猴子实体对象
			//创建喜欢血鬼
			monster = MonsterFactory.creatMonster("吸血鬼");
			monster.eat();
			monster.getName();
			monster.skill();
			
			//创建狸猫
			monster = monsterfactory.creatMonster("狸猫");
			monster.eat();
			monster.getName();
			monster.skill();
			
			
			//这里转型,从而可以调用life方法
			Monkey monster = (Monkey)monsterfactory.creatMonster("猴子");
			monster.eat();
			monster.skill();
			monster.getName();
			monster.life();
		
	}

}
运行结果如下

记录学习的每一步,记录每一次的成长!!!!

posted @ 2016-02-12 13:23  墨迹塔  阅读(1576)  评论(1编辑  收藏  举报