一分钟读懂设计模式--工厂模式

一、简单工厂模式

1具体的工厂类有一个create的方法,利用if/switch返回具体产品

2create方法通常时静态,所以也叫静态工厂。

缺点:扩展性差,要增加一个产品,还需要修改工厂类方法

           不同产品需要不同额外的参数时,不支持。

//面条,最好都用接口
public interface  INoodles {
    //描述面条的
    void desc();
}

public class LZNoodles implements INoodles {
    @Override
    public void desc() {
        System.out.println("兰州拉面 上海的好贵 家里才5 6块钱一碗");
    }
}

public class RGMNoodles implements INoodles {
    @Override
    public void desc() {
        System.out.println("武汉正宗热干面");
    }
}

public class SimpleNoodlesFactory {
    public static final int TYPE_LZ = 1;//兰州拉面
    public static final int TYPE_RGM = 3;//热干面

    public static INoodles createNoodles(int type) {
        switch (type) {
            case TYPE_LZ:
                return new LZNoodles();
            case TYPE_RGM:
            default:
                return new RGMNoodles();
        }
    }
}

二、工厂方法

解决了简单工厂 : 不支持不同产品需要不同额外的参数。现在只要为自己产品添加参数就行,不影响其他

                            新增一个产品时,需要改工厂方法的问题。现在只要新增一个产品实现INoodles,一个工厂实现NoodlesFactory,再调用就好。

缺点:产品多,比较麻烦,需要增加好多产品的工厂类。

//面条接口
public interface INoodles {
    //描述面条的
    void desc();
}
//产品--兰州拉面
public class LZNoodles implements INoodles {
    @Override
    public void desc() {
        System.out.println("兰州拉面 上海的好贵 家里才5 6块钱一碗");
    }
}
//产品--热干面
public class RGMNoodles implements INoodles {
    @Override
    public void desc() {
        System.out.println("武汉正宗热干面");
    }
}

//工厂类接口
public interface NoodlesFactory {
    INoodles createNoodles();
}
//热干面工厂
public class RGMFactory implements NoodlesFactory{

    @Override
    public INoodles createNoodles() {
        return new RGMNoodles();
    }
}
//兰州拉面工厂
public class LZFactory implements NoodlesFactory {
    @Override
    public INoodles createNoodles() {
        return new LZNoodles();
    }
}

//使用
LZFactory lzFactory = new LZFactory();
INoodles iNoodles2 = lzFactory.createNoodles();
iNoodles2.desc();

RGMFactory rgmFactory = new RGMFactory();
INoodles iNoodles3 = rgmFactory.createNoodles();
iNoodles3.desc();

三、抽象工厂

抽象工厂一般是用在较复杂的,生产工厂交叉。

比如横向对比,产品分产品A和产品B;纵向划分,可以分产品1和产品2。

生产线1生产产品1,生产线2生产产品2。

//抽象产品A
public abstract class AbstractProductA {
    public abstract void method();
}
//抽象产品B
public abstract class AbstractProductB {
    public abstract void method();
}
//具体产品A1
public class ConcreteProductA1 extends AbstractProductA {
    @Override
    public void method() {
        System.out.println("具体产品A1的方法");
    }
}
//具体产品A2
public class ConcreteProductA2 extends AbstractProductA {
    @Override
    public void method() {
        System.out.println("具体产品A2的方法");
    }
}
//具体产品B1
public class ConcreteProductB1 extends AbstractProductB {
    @Override
    public void method() {
        System.out.println("具体产品B1的方法");
    }
}
//具体产品B2
public class ConcreteProductB2 extends AbstractProductB {
    @Override
    public void method() {
        System.out.println("具体产品B2的方法");
    }
}
//抽象共产
public abstract class AbstractFactory {
    public abstract AbstractProductA createProductA();
    public abstract AbstractProductB createProductB();

}
//具体工厂1--生产A1,B1
public class ConcreteFactory1 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA1();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB1();
    }
}
//具体工厂2--生产A2,B2
public class ConcreteFactory2 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA2();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB2();
    }
}

 

总结:都是不用管如何创建具体产品,通过工厂去获取就行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值