工厂方法模式

工厂方法模式:定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象,也就是将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品的创建。可以这样理解工厂模式:由一个抽象工厂定义了创建产品的接口,但是具体是哪一种产品抽象工厂是不知道的,产品的实例化工作被推迟到具体工厂中。


代码实现:

抽象产品:

package com.demo.factorymethod.product;

public abstract class AbstractProduct {
	
	public AbstractProduct() {
	}
	
	public abstract void show();
}

具体产品:

package com.demo.factorymethod.product;

public class Product1 extends AbstractProduct {
	@Override
	public void show() {
		System.out.println("This is product1.");
	}
}

抽象工厂:

package com.demo.factorymethod.factory;

import com.demo.factorymethod.product.AbstractProduct;

public interface IFactory {
	public AbstractProduct createProduct();
}

具体工厂:

package com.demo.factorymethod.factory;

import com.demo.factorymethod.product.AbstractProduct;
import com.demo.factorymethod.product.Product1;

public class FactoryImpl1 implements IFactory {

	public FactoryImpl1() {
	}
	
	@Override
	public AbstractProduct createProduct() {
		return new Product1();
	}
}

测试代码:

package com.demo.factorymethod;

import com.demo.factorymethod.factory.FactoryImpl1;
import com.demo.factorymethod.factory.IFactory;
import com.demo.factorymethod.product.AbstractProduct;

public class MainApp {

	public static void main(String[] args) {
		IFactory factory = new FactoryImpl1();
		AbstractProduct product1 = factory.createProduct();
		product1.show();
	}

}

结果输出:

This is a product1.

如果又想生产其他的产品Product2,在保持原有程序的稳定性的情况下,该如何修改?可以再定义一个具体的工厂去实例化新的实例对象。


代码实现:

具体产品:

package com.demo.factorymethod.product;

import com.demo.factorymethod.product.AbstractProduct;

public class Product2 extends AbstractProduct {

	@Override
	public void show() {
		System.out.println("This is product2.");
	}
}

具体工厂:

package com.demo.factorymethod.factory;

import com.demo.factorymethod.product.AbstractProduct;
import com.demo.factorymethod.product.Product2;

public class FactoryImpl2 implements IFactory {

	public FactoryImpl2() {
	}
	
	@Override
	public AbstractProduct createProduct() {
		return new Product2();
	}
}

测试代码:

package com.demo.factorymethod;

import com.demo.factorymethod.factory.FactoryImpl2;
import com.demo.factorymethod.factory.IFactory;
import com.demo.factorymethod.product.AbstractProduct;

public class MainApp {

	public static void main(String[] args) {
		IFactory factory = new FactoryImpl2();
		AbstractProduct product2 = factory.createProduct();
		product2.show();
	}

}

结果输出:

This is product2.


使用工厂方法模式的适用场合:

1) 当子类的类型可能会有很多,以后需要不断增添不同的子类实现时;

2) 当一个系统尚在框架设计阶段,还不知道将来需要实例化那些具体类时;

3) 系统设计之初不需要具体对象的概念;

4) 需要生成复杂的对象时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值