工厂设计模式

工厂设计模式(Factory Pattern)

就是定义一个创建产品对象的接口。主要分为以下几种形态:

        1.简单工厂(Simple Factory);

        2.工厂方法(Factory Method);

       3.抽象工厂(Abstract Factory);

首先定义抽象产品类Product:
    
package com.demo.factory.model;
/**
 * 抽象产品接口
 * @author li
 *
 */
public abstract class Product {
	
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

具体产品Washer:
package com.demo.factory.model.object;

import com.demo.factory.model.Product;


/**
 * 具体产品:洗衣机
 * @author li
 *
 */
public class Washer extends Product {
	
	public Washer(){
		this.setName("洗衣机");
	}
	
}

具体产品Icebox:
package com.demo.factory.model.object;

import com.demo.factory.model.Product;


/**
 * 具体产品:冰箱
 * @author li
 *
 */
public class Icebox extends Product {
	
	public Icebox(){
	  this.setName("冰箱");
	}

}

一、简单工厂(SimpleFactory)模式:
package com.demo.factory;

import com.demo.factory.model.Product;
/**
 * 简单工厂
 * @author li
 *
 */
public class SimpleFactory {
	
	public static Product create(Class<? extends Product> c){
		Product p=null;
		try {
			 p=c.newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return p;
	}

}

注:简单工厂又叫 静态工厂 ,是工厂模式三中状态中结构最为简单的。主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例。当我们拥有很多很多产品的时候,而且产品之间又存在复杂的层次关系的时候,这个类必须拥有复杂的逻辑判断能力,其代码量也将不断地激增,这对以后的维护简直就是恐怖两个字...还有就是,整个系统都严重依赖SimpleFactory类,只要SimpleFactory类一出问题,系统就进入不能工作的状态,这也是最为致命的一点....
二、工厂方法:

首先定义抽象工厂接口Factory:
package com.demo.factory.itf;

import com.demo.factory.model.Product;
/**
 * 抽象工厂
 * @author li
 *
 */
public interface Factory {
	
	public Product create();

}
洗衣机的具体工厂WasherFactory:
package com.demo.factory;

import com.demo.factory.itf.Factory;
import com.demo.factory.model.Product;
import com.demo.factory.model.object.Washer;
/**
 * 创建洗衣机的具体工厂
 * @author li
 *
 */
public class WasherFactory implements Factory {

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

}
冰箱的具体工厂IceboxFactory:
package com.demo.factory;

import com.demo.factory.itf.Factory;
import com.demo.factory.model.Product;
import com.demo.factory.model.object.Icebox;
/**
 * 创建冰箱的具体工厂
 * @author li
 *
 */
public class IceboxFactory implements Factory {

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

}
注: 工厂方法 简单工厂 的主要区别是, 简单工厂 是把创建产品的职能都放在一个类里面,而 工厂方法 则把不同的产品放在实现了工厂接口的不同工厂类里面,这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。但 工厂方法 也有他局限的地方,那就是当面对的产品有复杂的等级结构的时候,例如,工厂除了生产家电外产品,还生产手机产品,这样一来家电是手机就是两大产品家族了,这两大家族下面包含了数量众多的产品,每个产品又有多个型号,这样就形成了一个复杂的产品树了。如果用 工厂方法 来设计这个产品家族系统,就必须为每个型号的产品创建一个对应的工厂类,当有数百种甚至上千种产品的时候,也必须要有对应的上百成千个工厂类,这就出现了传说的类爆炸,对于以后的维护来说,简直就是一场灾难.....
三、抽象工厂
首先定义抽象产品基类AbstractBaseProduct:
package com.demo.abfactory.model;
/**
 * 抽象产品基类
 * @author li
 *
 */
public abstract class AbstractBaseProduct {
	
	protected String version;
	
	protected double price;

	public abstract void printMessage();
}
定义洗衣机的抽象类AbstractWasher:
package com.demo.abfactory.model;
/**
 * 定义洗衣机的抽象类
 * @author li
 *
 */
public abstract class AbstractWasher extends AbstractBaseProduct{
	
	public abstract void wash();
	

}
定义冰箱的抽象类AbstractIcebox:
package com.demo.abfactory.model;
/**
 * 冰箱的抽象类
 * @author li
 *
 */
public abstract class AbstractIcebox extends AbstractBaseProduct{
	
	public abstract void freeze();

}
下来就是具体的产品类。
美的洗衣机的实现类MideaWasher:
package com.demo.abfactory.model.object;

import com.demo.abfactory.model.AbstractWasher;
/**
 * 美的洗衣机
 * @author li
 *
 */
public class MideaWasher extends AbstractWasher{
	
	public MideaWasher(){
		this.version="1.0";
		this.price=5000.00;
	}

	@Override
	public void printMessage() {
		System.out.println("price"+this.price+"  "+"version"+this.version);
	}

	@Override
	public void wash() {
      System.out.println("美的"+this.version+"洗衣服。。。");
	}

}
美的冰箱类的实现MideaIcebox:
package com.demo.abfactory.model.object;
import com.demo.abfactory.model.AbstractIcebox;
/**
 * 美的冰箱
 * @author li
 *
 */
public class MideaIcebox extends AbstractIcebox  {

    public MideaIcebox(){
    	this.version="1.0";
    	this.price=7000.00;
    }

	@Override
	public void freeze() {
		System.out.println("美的冰箱"+this.version+"冷藏。。。");
	}

	@Override
	public void printMessage() {
		System.out.println("price"+this.price+"  "+"version"+this.version);
	}

}
海尔洗衣机的实现类HaierWasher:
package com.demo.abfactory.model.object;

import com.demo.abfactory.model.AbstractWasher;
/**
 * 海尔洗衣机
 * @author li
 *
 */
public class HaierWasher extends AbstractWasher {
	
	public HaierWasher(){
		this.version="1.0";
        this.price=6000.00;
	}

	@Override
	public void printMessage() {
        System.out.println("price"+this.price+"  "+"version"+this.version);
	}

	@Override
	public void wash() {
     System.out.println("海尔"+this.version+"洗衣服。。。");
	}

}
海尔冰箱的实现类HaierIcebox:
package com.demo.abfactory.model.object;
import com.demo.abfactory.model.AbstractIcebox;
/**
 * 海尔冰箱
 * @author li
 *
 */
public class HaierIcebox extends AbstractIcebox {
	
	public HaierIcebox(){
		this.version="1.0";
		this.price=8000.00;
	}

	@Override
	public void printMessage() {
		System.out.println("price"+this.price+"  "+"version"+this.version);
	}

	@Override
	public void freeze() {
		System.out.println("海尔冰箱"+this.version+"冷藏。。。");
	}

}
抽象工厂接口Factory:
package com.demo.abfactory.itf;

import com.demo.abfactory.model.AbstractIcebox;
import com.demo.abfactory.model.AbstractWasher;
/**
 * 抽象工厂
 * @author li
 *
 */
public interface Factory {
	
	public AbstractWasher createWasher();
	
	public AbstractIcebox createIcebox();

}
美的工厂实现类MideaFactory:
package com.demo.abfactory;

import com.demo.abfactory.itf.Factory;
import com.demo.abfactory.model.AbstractIcebox;
import com.demo.abfactory.model.AbstractWasher;
import com.demo.abfactory.model.object.MideaIcebox;
import com.demo.abfactory.model.object.MideaWasher;
/**
 * 美的产品具体工厂
 * @author li
 *
 */
public class MideaFactory implements Factory {

	@Override
	public AbstractWasher createWasher() {
		return new MideaWasher();
	}

	@Override
	public AbstractIcebox createIcebox() {
		return new MideaIcebox();
	}

}
海尔工厂实现类HaierFactory:
package com.demo.abfactory;

import com.demo.abfactory.itf.Factory;
import com.demo.abfactory.model.AbstractIcebox;
import com.demo.abfactory.model.AbstractWasher;
import com.demo.abfactory.model.object.HaierIcebox;
import com.demo.abfactory.model.object.HaierWasher;
/**
 * 海尔产品具体工厂
 * @author li
 *
 */
public class HaierFactory implements Factory{

	@Override
	public AbstractWasher createWasher() {
		return new HaierWasher();
	}

	@Override
	public AbstractIcebox createIcebox() {
		return new HaierIcebox();
	}

}
注: 抽象工厂提供了一个接口(Factory)用于创建相关或者依赖对象的家族,而不需要具体的实现类,使客户端不必指定具体产品的情况下创建产品家族中的产品对象。抽象工厂的任务就是负责创建一组产品接口,每个接口负责创建一种产品。抽象工厂和工厂方法的区别:1). 工厂模式通过继承实现程序解耦,而抽象工厂则是通过组合实现程序解耦。2). 工厂方法用来创建一个抽象产品,具体工厂实现工厂方法创建具体产品,而抽象工厂用来创建一个产品家族的抽象产品。

















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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值