工厂模式是一种常用的实例化对象的设计模式,它用工厂方法代替了实例化对象时的new操作。工厂模式主要分为三种,分别是简单工厂,工厂方法和抽象工厂。我们来一一介绍。
假定工厂生产的产品需要一个统一的接口如下:
package 工厂模式;
/**
* 统一的产品接口
*/
public interface Product {
public String ProStandard();
}
1.简单工厂
package 工厂模式;
/**
* 简单工厂
* 定义一个产品接口Product
* 然后定义实现Porduct接口的三个产品实现类,Washer,IceBox,AirCondithon
* 在SimpleFactory类里,直接生产相应的产品
*/
public class SimpleFactory {
/**
* 根据传递的产品名称来生产产品
* @param productName
* @return
* @throws Exception
*/
static Product createProduct(String productName) throws Exception{
if("Washer".equals(productName)){
return new Washer();
}else if("IceBox".equals(productName)){
return new IceBox();
}else if("AirCondition".equals(productName)){
return new AirCondition();
}else{
throw new Exception("没有该产品!");
}
}
/**
* 入口函数
* @param args
*/
public static void main(String[] args) {
//生产三种产品
try {
createProduct("Washer");
//如果输错产品名称,会导致无法生产
// createProduct("Washer1");
createProduct("IceBox");
createProduct("AirCondition");
//生产暂时没有的产品时,需要再创建相应的产品实现类,而且要多出修改
// createProduct("Television");
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 洗衣机
* @author Administrator
*
*/
class Washer implements Product{
/**
* 实例化时就生产洗衣机
*/
public Washer() {
System.out.println(ProStandard()+"洗衣机生产了!");
}
@Override
public String ProStandard() {
return "==符合"+this.getClass().getSimpleName()+"产品标准---";
}
}
/**
* 冰箱
*/
class IceBox implements Product{
/**
* 实例化时就生产冰箱
*/
public IceBox(){
System.out.println(ProStandard()+"冰箱生产了!");
}
@Override
public String ProStandard() {
return "==符合"+this.getClass().getSimpleName()+"产品标准---";
}
}
/**
* 空调
*/
class AirCondition implements Product{
/**
* 实例化时就生产空调
*/
public AirCondition(){
System.out.println(ProStandard()+"空调生产了!");
}
@Override
public String ProStandard() {
return "==符合"+this.getClass().getSimpleName()+"产品标准---";
}
}
上述代码执行后,控制台打印如下:
==符合Washer产品标准---洗衣机生产了!
==符合IceBox产品标准---冰箱生产了!
==符合AirCondition产品标准---空调生产了!
简单工厂存在高耦合的情况,如果产品的生产计划更改,需要在源代码中更改,不符合面向对象中的“向继承开放,向修改关闭”的原则。
2.工厂方法
package 工厂模式;
/**
* 定义一个统一的工厂接口
*/
public interface Factory {
public String facStandard();
//public Product createProduct();
}
---------------------------------------------------------
package 工厂模式;
/**
* 工厂方法
* 声明实现Factory接口的三个工厂类,分别生产洗衣机,冰箱,空调
* 这些工厂实现类里均有生产产品的方法
*/
public class FactoyMethod {
//程序入口方法
public static void main(String[] args) {
new WasherFactory().createProduct();
new IceBoxFactory().createProduct();
new AirConditionFactory().createProduct();
}
}
/**
* 洗衣机厂
*/
class WasherFactory implements Factory{
@Override
public String facStandard() {
return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
}
// @Override
public Product createProduct() {
System.out.println(facStandard());
return new Washer();
}
}
/**
* 冰箱厂
*/
class IceBoxFactory implements Factory{
@Override
public String facStandard() {
return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
}
// @Override
public Product createProduct() {
System.out.println(facStandard());
return new IceBox();
}
}
/**
* 空调厂
*/
class AirConditionFactory implements Factory{
@Override
public String facStandard() {
return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
}
// @Override
public Product createProduct() {
System.out.println(facStandard());
return new AirCondition();
}
}
上述代码执行后,控制台打印如下:
***符合WasherFactory工厂标准---
==符合Washer产品标准---洗衣机生产了!
***符合IceBoxFactory工厂标准---
==符合IceBox产品标准---冰箱生产了!
***符合AirConditionFactory工厂标准---
==符合AirCondition产品标准---空调生产了!
工厂方法可以通过某些专业的工厂来生产特定产品,在解耦合方面比简单工厂有很大的进步。但是,在面临更为复杂的生产形势,尤其是产品线更为庞大时,就要采用抽象工厂了。
3.抽象工厂
package 工厂模式;
/**
* 抽象工厂
* 便于产品分类
*/
public class AbstractFactory {
public static void main(String[] args) {
new WasherFactory_A_Depart().createProduct();
new WasherFactory_B_Depart().createProduct();
new IceBoxFactory_A_Depart().createProduct();
new IceBoxFactory_B_Depart().createProduct();
new AirConditionFactory_A_Depart().createProduct();
new AirConditionFactory_B_Depart().createProduct();
}
}
/**
* 洗衣机产品
*/
abstract class WasherAbstract implements Product {
}
/**
* 洗衣机产品A系列
*/
class Washer_A extends WasherAbstract{
public Washer_A(){
System.out.println(this.toString());
}
@Override
public String ProStandard() {
return "==符合"+this.getClass().getSimpleName()+"产品标准---";
}
@Override
public String toString() {
return ProStandard()+this.getClass().getSimpleName()+"生产了!";
}
}
/**
* 洗衣机产品B系列
*/
class Washer_B extends WasherAbstract{
public Washer_B(){
System.out.println(this.toString());
}
@Override
public String ProStandard() {
return "==符合"+this.getClass().getSimpleName()+"产品标准---";
}
@Override
public String toString() {
return ProStandard()+this.getClass().getSimpleName()+"生产了!";
}
}
/**
* 冰箱产品
*/
abstract class IceBoxAbstract implements Product{}
/**
* 冰箱产品A系列
*/
class IceBox_A extends IceBoxAbstract{
public IceBox_A(){
System.out.println(this.toString());
}
@Override
public String ProStandard() {
return "==符合"+this.getClass().getSimpleName()+"产品标准---";
}
@Override
public String toString() {
return ProStandard()+this.getClass().getSimpleName()+"生产了!";
}
}
/**
* 冰箱产品B系列
*/
class IceBox_B extends IceBoxAbstract{
public IceBox_B(){
System.out.println(this.toString());
}
@Override
public String ProStandard() {
return "==符合"+this.getClass().getSimpleName()+"产品标准---";
}
@Override
public String toString() {
return ProStandard()+this.getClass().getSimpleName()+"生产了!";
}
}
/**
* 空调产品
*/
abstract class AirConditionAbstract implements Product{}
/**
* 空调产品A系列
*/
class AirCondition_A extends AirConditionAbstract{
public AirCondition_A(){
System.out.println(this.toString());
}
@Override
public String ProStandard() {
return "==符合"+this.getClass().getSimpleName()+"产品标准---";
}
@Override
public String toString() {
return ProStandard()+this.getClass().getSimpleName()+"生产了!";
}
}
/**
* 空调产品B系列
*/
class AirCondition_B extends AirConditionAbstract{
public AirCondition_B(){
System.out.println(this.toString());
}
@Override
public String ProStandard() {
return "==符合"+this.getClass().getSimpleName()+"产品标准---";
}
@Override
public String toString() {
return ProStandard()+this.getClass().getSimpleName()+"生产了!";
}
}
/**
* 洗衣机工厂
* @author Administrator
*
*/
abstract class WasherFactoryAbstract implements Factory{}
/**
* 生产洗衣机产品A系列的车间
*/
class WasherFactory_A_Depart extends WasherFactoryAbstract{
@Override
public String facStandard() {
return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
}
// @Override
public Product createProduct() {
System.out.println(facStandard());
return new Washer_A();
}
}
/**
* 生产洗衣机产品B系列的车间
*/
class WasherFactory_B_Depart extends WasherFactoryAbstract{
@Override
public String facStandard() {
return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
}
// @Override
public Product createProduct() {
System.out.println(facStandard());
return new Washer_B();
}
}
/**
* 冰箱工厂
*/
abstract class IceBoxFactoryAbstract implements Factory{}
/**
* 生产冰箱产品A系列的车间
*/
class IceBoxFactory_A_Depart extends IceBoxFactoryAbstract{
@Override
public String facStandard() {
return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
}
// @Override
public Product createProduct() {
System.out.println(facStandard());
return new IceBox_A();
}
}
/**
* 生产冰箱产品B系列的车间
*/
class IceBoxFactory_B_Depart extends IceBoxFactoryAbstract{
@Override
public String facStandard() {
return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
}
// @Override
public Product createProduct() {
System.out.println(facStandard());
return new IceBox_B();
}
}
/**
* 空调工厂
*/
abstract class AirConditionFactoryAbstract implements Factory{}
/**
* 生产空调产品A系列的车间
*/
class AirConditionFactory_A_Depart extends AirConditionFactoryAbstract{
@Override
public String facStandard() {
return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
}
// @Override
public Product createProduct() {
System.out.println(facStandard());
return new AirCondition_A();
}
}
/**
* 生产空调产品B系列的车间
*/
class AirConditionFactory_B_Depart extends AirConditionFactoryAbstract{
@Override
public String facStandard() {
return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
}
// @Override
public Product createProduct() {
System.out.println(facStandard());
return new AirCondition_B();
}
}
上述代码执行后,控制台打印如下:
***符合WasherFactory_A_Depart工厂标准---
==符合Washer_A产品标准---Washer_A生产了!
***符合WasherFactory_B_Depart工厂标准---
==符合Washer_B产品标准---Washer_B生产了!
***符合IceBoxFactory_A_Depart工厂标准---
==符合IceBox_A产品标准---IceBox_A生产了!
***符合IceBoxFactory_B_Depart工厂标准---
==符合IceBox_B产品标准---IceBox_B生产了!
***符合AirConditionFactory_A_Depart工厂标准---
==符合AirCondition_A产品标准---AirCondition_A生产了!
***符合AirConditionFactory_B_Depart工厂标准---
==符合AirCondition_B产品标准---AirCondition_B生产了!