百度百科:用工厂方法代替new操作的一种模式
我的理解是:工厂模式就是提供一个工厂方法,传入指定的参数得到我想要的对象。
引申:抗战时期的地下党员 为了安全 都是单线联系 地下党员之间不是之间联系 而是通过 接线员 交接 这个交接员就相当于工厂Factory 把new创建对象的过程交给工厂 降低程序的耦合性!
工厂模式又分为:简单工厂模式,工厂模式、抽象工厂模式
简单工厂模式:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现
工厂模式:工厂模式本质就是代替new创建对象
抽象工厂模式:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式
二、运用
A、简单工厂模式
我去商店买水果,老板很懒,让我自己去拿(工厂类)
1、创建一个水果接口
/**
* 描述:商店 <p>
* 作者: kimball <p>
* E-mail: kimballlu@foxmail.com <p>
* 日期:2016-11-23 下午5:07:28 <p>
*/
public interface Fruits {
/**
* 描述
*/
public void describe();
}
2、创建苹果
/**
* 描述: 苹果<p>
* 作者: kimball <p>
* E-mail: kimballlu@foxmail.com <p>
* 日期:2016-11-23 下午5:06:39 <p>
*/
public class Apple implements Fruits {
public void describe() {
System.out.println("我是苹果");
};
}
3、创建香蕉
/**
* 描述: 香蕉<p>
* 作者: kimball <p>
* E-mail: kimballlu@foxmail.com <p>
* 日期:2016-11-23 下午5:12:23 <p>
*/
public class Banana implements Fruits {
public void describe() {
System.out.println("我是香蕉");
}
}
4、创建工厂类
/**
* 描述: 水果工厂<p>
* 作者: kimball <p>
* E-mail: kimballlu@foxmail.com <p>
* 日期:2016-11-23 下午5:15:30 <p>
*/
public class FruitsFactory {
/**
* 获取苹果
* @return Apple
*/
public static Apple createApple(){
return new Apple();
}
/**
* 获取香蕉
* @return Banana
*/
public static Banana createBanana(){
return new Banana();
}
}
5、测试类
/**
* 描述:测试类 <p>
* 作者: kimball <p>
* E-mail: kimballlu@foxmail.com <p>
* 日期:2016-11-23 下午5:18:29 <p>
*/
public class Test {
public static void main(String[] args) {
Apple apple = FruitsFactory.createApple();
apple.describe();
Banana banana = FruitsFactory.createBanana();
banana.describe();
}
}
6、结果
B、工厂模式
我去商店想要买水果,跟老板(工厂类)指定水果名称,老板就会给我我想要的对象,水果
1、创建一个水果描述的接口
/**
* 描述:水果 <p>
* 作者: kimball <p>
* E-mail: kimballlu@foxmail.com <p>
* 日期:2016-11-22 上午10:09:33 <p>
*/
public interface Fruits {
/**
* 描述
*/
public void describe();
}
2、创建水果对应的对象并实现水果的接口
/**
* 描述:苹果 <p>
* 作者: kimball <p>
* E-mail: kimballlu@foxmail.com <p>
* 日期:2016-11-22 上午10:11:12 <p>
*/
public class Apple implements Fruits {
public void describe() {
System.out.println("我是苹果");
}
}
/**
* 描述:香蕉 <p>
* 作者: kimball <p>
* E-mail: kimballlu@foxmail.com <p>
* 日期:2016-11-22 上午10:14:51 <p>
*/
public class Banana implements Fruits {
public void describe() {
System.out.println("我是香蕉");
}
}
3、创建水果工厂
/**
* 描述:水果工厂 <p>
* 作者: kimball <p>
* E-mail: kimballlu@foxmail.com <p>
* 日期:2016-11-22 上午10:19:21 <p>
*/
public class FruitsFactory {
/**
* 购买水果
* @param name
* @return Shop
*/
public Fruits purchaseFruits(String name){
if("Apple".equals(name)){
// 苹果
return new Apple();
}else if("Banana".equals(name)){
// 香蕉
return new Banana();
}
return null;
}
}
4、编写测试类
/**
* 描述:测试类 <p>
* 作者: kimball <p>
* E-mail: kimballlu@foxmail.com <p>
* 日期:2016-11-22 上午10:27:50 <p>
*/
public class Test {
public static void main(String[] args) {
FruitsFactory factory = new FruitsFactory();
Fruits apple = factory.purchaseFruits("Apple");
apple.describe();
Fruits banana = factory.purchaseFruits("Banana");
banana.describe();
}
}
5、输出结果
C、抽象工厂模式
1、因为苹果还分红苹果和青苹果等等,所以创建苹果抽象类
/**
* 描述:苹果抽象类 <br>
* 作者: kimball <br>
* E-mail: kimballlu@foxmail.com <br>
* 日期:2016年12月6日 下午6:03:27 <br>
*/
public abstract class FruitsApple {
/**
* 描述
*/
public abstract void describe();
}
2、创建苹果类
/**
* 描述:苹果 <br>
* 作者: kimball <br>
* E-mail: kimballlu@foxmail.com <br>
* 日期:2016年12月6日 下午6:04:36 <br>
*/
public class Apple extends FruitsApple {
@Override
public void describe() {
System.out.println("我是苹果");
}
}
3、同样,香蕉也是分很多种,创建香蕉抽象类
/**
* 描述:香蕉抽象类 <br>
* 作者: kimball <br>
* E-mail: kimballlu@foxmail.com <br>
* 日期:2016年12月6日 下午6:09:32 <br>
*/
public abstract class FruitsBanana {
/**
* 描述
*/
public abstract void describe();
}
4、创建香蕉
/**
* 描述:香蕉 <br>
* 作者: kimball <br>
* E-mail: kimballlu@foxmail.com <br>
* 日期:2016年12月6日 下午6:10:16 <br>
*/
public class Banana extends FruitsBanana {
@Override
public void describe() {
System.out.println("我是香蕉");
}
}
5、创建商人工厂类
/**
* 描述:商人类,通过反射实现抽象工厂 <br>
* 作者: kimball <br>
* E-mail: kimballlu@foxmail.com <br>
* 日期:2016年12月6日 下午6:10:54 <br>
*/
public class BusinessmanAbstractFactory {
/**
* 创建苹果
* @param name 指定创建的苹果类路径
* @return FruitsApple
* @throws InstantiationException
* @throws IllegalAccessException
* @throws ClassNotFoundException
*/
public static FruitsApple createApple(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
if("".equals(name) || name == null){
return null;
}
return (FruitsApple) Class.forName(name).newInstance();
}
/**
* 创建香蕉
* @param name 指定创建的香蕉类路径
* @return FruitsBanana
* @throws InstantiationException
* @throws IllegalAccessException
* @throws ClassNotFoundException
*/
public static FruitsBanana createBanana(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
if("".equals(name) || name == null){
return null;
}
return (FruitsBanana) Class.forName(name).newInstance();
}
}
6、创建测试类
/**
* 描述:测试类 <br>
* 作者: kimball <br>
* E-mail: kimballlu@foxmail.com <br>
* 日期:2016年12月6日 下午6:19:48 <br>
*/
public class Test {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
FruitsApple apple = BusinessmanAbstractFactory.createApple("com.newtt.Apple");
apple.describe();
FruitsBanana banana = BusinessmanAbstractFactory.createBanana("com.newtt.Banana");
banana.describe();
}
}
7、运行结果