设计模式--工厂模式和抽象工厂模式


工厂模式的英文原文是:Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory method lets a class defer instantiation to subclass. 意思是定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到子类。

工厂模式主要是为创建对象提供了接口,工厂模式可分为三类:

简单工厂模式:又叫做静态方法模式,简单工厂模式就是工厂类根据传入的参数决定实例化哪个类的对象。


工厂方法模式:工厂方法模式是new一个对象的替代品,因此在所有需要生成对象的地方都可以使用。它具有良好的封装性,代码结构清晰,如果一个调用者需要一个具体的产品对象,只要知道这个产品的类名即可,不需要知道这个产品的创建过程如何,降低了模块间的耦合度。优秀的扩展性,在增加产品类的情况下,只要适当的修改具体的工厂类就可以适应变化。屏蔽产品类,产品类是如何实现的,调用者不必关心,只需关注产品的接口即可。


抽象工厂:

package com.zz.factory;

/**
 * 抽象工厂
 * @author txxs
 *
 */
public interface Creator {
	/**
	 * 工厂方法
	 * 创建一个产品对象,起输入的参数类型可以自行设置
	 */
	public <T extends Product> T factory(Class<T> c);

}

抽象产品:

package com.zz.factory;

/**
 * 抽象产品
 * @author txxs
 *
 */
public interface Product {
	//产品类提供的公共方法接口
	public void method1();
	public void method2();

}
两个具体的实现:

package com.zz.factory;
/**
 * 具体工厂
 * @author txxs
 *
 */
public class ConcreteCreator implements Creator {

	@Override
	public <T extends Product> T factory(Class<T> c) {
		Product product = null;
		try{
			product = (Product)Class.forName(c.getName()).newInstance();
		}catch(Exception e){
			
		}
		// TODO Auto-generated method stub
		return (T) product;
	}

}

package com.zz.factory;

public class ConcreteProduct implements Product {

	@Override
	public void method1() {
		// 业务逻辑处理代码

	}
	
	@Override
	public void method2() {
		// 业务逻辑处理代码

	}

}


抽象工厂模式:它的英文定义是:Provide an interface  for creating families of ralated or dependent objects without specifying their concrete classes.意思是为创建一组相关或互相依赖的对象提供接口,而无须他们的具体实现类。抽象工厂模式是工厂方法的升级版本,针对的是一系列的产品,如果抽象工厂方法中只有一种产品,那么抽象工厂模式就退化为工厂方法模式。


抽象工厂:

package com.zz.abfactory;
/**
 * 抽象工厂
 * @author txxs
 *
 */
public interface AbstractFactory {
	//创建产品A
	public ProductA factoryA();
	//创建产品B
	public ProductB factoryB();

}
测试类:

package com.zz.abfactory;
/**
 * 测试类
 * @author txxs
 *
 */
public class AbstractFactoryTest {

	public static void main(String[] args) {
		
		//定义两个工厂
		AbstractFactory abstractFactory1 = new ConcreteFactory1();
		AbstractFactory abstractFactory2 = new ConcreteFactory2();
		
		//生产等级为1的产品A
		ProductA productA1 = abstractFactory1.factoryA();
		//生产等级为2的产品A
		ProductA productA2 = abstractFactory2.factoryA();
		
		//生产等级为1的产品B
		ProductB productB1 = abstractFactory1.factoryB();
		//生产等级为2的产品B
		ProductB productB2 = abstractFactory2.factoryB();
		
		//业务处理
		productA1.method1();
		productA2.method1();
		productB1.method1();
		productB2.method1();
	}

}

哈哈,正在学习, 源码下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值