工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
1.简单工厂模式 ,使用场景:负责创建的对象比较少;客户只知道传入工厂类的参数,对于如何创建对象的逻辑不关心;容易违反高内聚责任分配原则,所以只在很简单的情况下应用
public interface IProduct{
public void saleProduct();
}
public class Product_A implements IProduct{
public void saleProduct(){ }
}
public class Product_B implements IProduct{
public void saleProduct(){}
}
public class Creator{
public IProduct createProduct(int productFlag){
switch(productFlag){
case 1:
return new Product_A();
case 2:
return new Product_B();
default:
return null;
}
}
}
2.工厂模式,使用场景:对于某个产品,调用者清楚知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来;只是需要一种产品,对于那个工厂生产的并不关心,最终选用哪个具体工厂由生产者一方决定,它根据当前系统的情况来实例化一个具体的工厂返回给使用者,这个决策过程对于使用者来说是透明的。
//抽象工厂
public interface Creator{
public Light factory();
}
//抽象产品
public interface Light{
public void TurnOn();
}
//具体产品
public class BullbLight implements Light{
public void TurnOn(){
}
}
//具体产品
public class TubeLight implements Light{
public void TurnOn(){
}
}
//具体工厂
public class BullbCreator implements Creator{
public Light factory(){
return new BullbLight();
}
}
//具体工厂
public class TubeCreator implements Creator{
public Light factory(){
return new TubeLight();
}
}
public class Client{
public static void main(String[] args){
Creator create = new BullbCreator();
Light bullbLight = create.factory();
Creator create1 = new TubeCreator();
Light tubebLight = create.factory();
}
}
3.抽象工厂模式,抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
public interface AbstractFactory{
public ProductA createProductA();
public ProductB createProductB();
}
//抽象产品类A
public interface AbstractProductA
{
}
//抽象产品类B
public interface AbstractProductB
{
}
//具体产品类ProdcutA1
public class ProductA1 implements AbstractProductA
{
public ProductA1()
{
}
}
//具体产品类ProdcutA2
public class ProductA2 implements AbstractProductA
{
public ProductA2()
{
}
}
//具体产品类ProductB1
public class ProductB1 implements AbstractProductB
{
public ProductB1()
{
}
}
//具体产品类ProductB2
public class ProductB2 implements AbstractProductB
{
public ProductB2()
{
}
}
//具体工厂类1
public class ConcreteFactory1 implements AbstractFactory{
public AbstractProductA createProductA(){
return new ProductA1();
}
public AbstractProductB createProductB(){
return new ProductB1();
}
}
//具体工厂类2
public class ConcreteFactory2 implements Creator{
public AbstractProductA createProductA(){
return new ProductA2();
}
public AbstractProductB createProductB(){
return new ProductB2();
}
}