设计模式(二)——工厂模式

         今天来说一个很基础的设计模式——工厂设计模式。其实工厂设计模式可以细分为三种类似的设计模式:

1)简单工厂模式(SimpleFactory):简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。

2)工厂方法模式(FactoryMethod):又称为多形性工厂,有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。

3)抽象工厂模式(AbstractFactory):又称为工具箱,产生产品族,但不利于产生新的产品;        这三种模式从上到下逐步抽象,并且更具一般性。抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。

         下面列出这三种设计模式的类图,从总体上来把个关:

(1)      简单工厂模式:


(2)      工厂方法模式:

 

(3)      抽象工厂模式:

 

还是惯例,贴上实例代码帮助理解:

(1)      简单工厂模式:

 所有的产品类都要实现同一个产品接口:

package com.xdccl.zwj.SimpleFactoryDesignPatterns;

public interface Product {

}
具体的产品类:

package com.xdccl.zwj.SimpleFactoryDesignPatterns;

public class Computer implements Product {
	public Computer(){
		System.out.println("生产了电脑!");
	}
}

package com.xdccl.zwj.SimpleFactoryDesignPatterns;

public class MobilePhone implements Product {
	public MobilePhone(){
		System.out.println("生产了手机!");
	}
}
简单工厂类:
package com.xdccl.zwj.SimpleFactoryDesignPatterns;

public class SimpleFactory {
	public static Product factory(String productName) throws Exception{
		if("Computer".equals(productName))
			return new Computer() ;
		else if("MobilePhone".equals(productName))
			return new MobilePhone() ;
		else
			throw new Exception("你所需要生产的产品不存在!") ;
	}
}

客户端:

package com.xdccl.zwj.SimpleFactoryDesignPatterns;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			SimpleFactory.factory("Computer") ;
			SimpleFactory.factory("MobilePhone") ;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
如果执行以上代码,那么可以得到的结果应该是:

生产了电脑!
生产了手机!

这也就说明相应的简单工厂可以生产对应对象的实例。

(2)      工厂方法模式:

  在该方法中,将工厂和产品分别抽象出来,这样的好处是,一旦一个工厂出问题,也不会影响到其他工厂的生产。

工厂接口:

package com.xdccl.zwj.FactoryMethodDesignPatterns;

public interface Factory {
	//工厂接口
	/**
	 * 用来生产的方法,不同的工厂应该具有不同的生产产品
	 * @return	返回生产的产品对象
	 */
	public Product create() ;
}
工厂类,具体的生产工厂:

package com.xdccl.zwj.FactoryMethodDesignPatterns;

public class ComputerFactory implements Factory{

	@Override
	public Product create() {
		return new Computer();
	}

}

package com.xdccl.zwj.FactoryMethodDesignPatterns;

public class MobilePhoneFactory implements Factory {

	@Override
	public Product create() {
		return new MobilePhone();
	}

}
产品接口:

package com.xdccl.zwj.FactoryMethodDesignPatterns;

public interface Product {
	//产品接口
}
产品类:

package com.xdccl.zwj.FactoryMethodDesignPatterns;

public class Computer implements Product {
	public Computer(){
		System.out.println("一个新电脑!");
	}
}

package com.xdccl.zwj.FactoryMethodDesignPatterns;

public class MobilePhone implements Product {
	public MobilePhone(){
		System.out.println("一个新手机!");
	}
}
客户端:

package com.xdccl.zwj.FactoryMethodDesignPatterns;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new ComputerFactory().create() ;			//生产一个电脑
		new MobilePhoneFactory().create() ;			//生产一个手机
	}

}
如果上面的代码运行顺利,那么就可以得到下面的结果:

一个新电脑!
一个新手机!
(3)      抽象工厂模式:

  抽象工厂模式是将产品分类,工厂也进行分类,这样的好处就是可以选择性调用。

具体类产品接口:

package com.xdccl.zwj.AbstractFactoryDesignPatterns;

public interface Computer {
	//电脑产品的接口
}
package com.xdccl.zwj.AbstractFactoryDesignPatterns;

public interface MobilePhone {
	//手机产品的接口
}
分类后的产品:

package com.xdccl.zwj.AbstractFactoryDesignPatterns;

public class ComputerA implements Computer {
	public ComputerA(){
		System.out.println("电脑A产品");
	}
}
package com.xdccl.zwj.AbstractFactoryDesignPatterns;

public class ComputerB implements Computer {
	public ComputerB(){
		System.out.println("电脑B产品");
	}
}

package com.xdccl.zwj.AbstractFactoryDesignPatterns;

public class MobilePhoneA implements MobilePhone {
	public MobilePhoneA(){
		System.out.println("手机A产品");
	}
}
package com.xdccl.zwj.AbstractFactoryDesignPatterns;

public class MobilePhoneB implements MobilePhone {
	public MobilePhoneB(){
		System.out.println("手机B产品");
	}
}

工厂类:

package com.xdccl.zwj.AbstractFactoryDesignPatterns;

public interface Factory {
	public Computer createComputer() ;
	public MobilePhone createMobilePhone() ;
}

具体的工厂进行分类:

package com.xdccl.zwj.AbstractFactoryDesignPatterns;

public class FactoryA implements Factory {

	@Override
	public Computer createComputer() {
		return new ComputerA();
	}

	@Override
	public MobilePhone createMobilePhone() {
		return new MobilePhoneA();
	}

}

package com.xdccl.zwj.AbstractFactoryDesignPatterns;

public class FactoryB implements Factory {

	@Override
	public Computer createComputer() {
		return new ComputerB();
	}

	@Override
	public MobilePhone createMobilePhone() {
		return new MobilePhoneB();
	}

}

客户端:

package com.xdccl.zwj.AbstractFactoryDesignPatterns;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//生产A产品
		Factory fa = new FactoryA() ;
		fa.createComputer() ;
		fa.createMobilePhone() ;
		//生产B产品
		Factory fb = new FactoryB() ;
		fb.createComputer() ;
		fb.createMobilePhone() ;
	}

}

如果如上所述,结果应该是:

电脑A产品
手机A产品
电脑B产品
手机B产品

好了,这些就是工厂模式了,总结完毕,好长好累啊~~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值