设计模式之工厂模式(三种)

六大设计原则

  1. 单一职责(一个类干一件事)
  2. 接口原则(接口方法都能用到)
  3. 依赖倒转(接口编程) --用到
  4. 里氏替换(继承性的重写改变了,复用性差)
  5. 开闭原则(扩展开放、修改关闭) --用到
  6. 迪米特法则(一个类对其他类保持最少的了解) --用到

工厂模式

Spring初始化时候使用到了工厂模式
优点
扩展性高,封装性好,使用者不用了解使用对象。
缺点
添加产品需要添加工厂类,若数量过多则增加了系统的复杂度。

简单工厂模式

缺点:扩展性不好,添加新产品会修改到工厂的代码(不符合开闭原则)
优点:创建对象交由工厂处理,外界不必关心
面条的接口工厂

public interface Noodles {
    void eating();
}

兰州拉面实现

public class LzNoodles implements Noodles {
    @Override
    public void eating() {
        System.out.println("兰州拉面生产.....");
    }
}

泡面实现

public class PaoNoodles implements Noodles {
    @Override
    public void eating() {
        System.out.println("泡面生产.....");
    }
}

面馆(吃什么面,创建什么对象交由面馆来管理,你不用知道面怎么做的,你只需要知道你要什么面就行了)

public class SimpleNoodlesFactory {
    public static final int TYPE_LZ = 1;//兰州拉面
    public static final int TYPE_PM = 2;//泡面

    public static Noodles createNoodles(int type) {
        switch (type) {
            case TYPE_LZ:
                return new LzNoodles();
            default:
                return new PaoNoodles();
        }
    }
}

对外只暴露了面馆,可以通过面馆点你需要的面

  INoodles noodles = SimpleNoodlesFactory.createNoodles
  						(SimpleNoodlesFactory.TYPE_PM );
  noodles.eating()

工厂方法模式;

缺点,扩展是会创建新的工厂类(泡面工厂、兰州拉面工厂),造成类膨胀
优点:完全符合开闭原则

将简单工厂也定义为接口,在分不同面工厂实现这个接口,最后通过面工厂创建实现面的创建。

将面馆定义为接口

public interface SimpleNoodlesFactory {
	void createNodle();
}

兰州拉面工厂实现面馆

public class LzFactory implements Noodles {
    @Override
    public Noodles createNodle() {
        return new LzNoodles;
    }
}

泡面工厂实现面馆

public class PaoFactory implements Noodles {
    @Override
    public Noodles createNodle() {
        return new LzNoodles;
    }
}

客户店面

LzNoodles lzNoodles = new PaoFactory().createNodle(); 

抽象工厂模式

缺点:假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。

不可以增加产品,可以增加产品族

如果增加产品了 高端汽车类工厂、低端汽车类工厂都需要增加代码,这样不符合开闭原则

Engine、Seat  一堆实现类,但是不可以增加产品

public interface CarFactory {
	Engine createEngine(); //引擎族
	Seat createSeat(); //座位族
	......   //其他族

高端汽车类工厂

/**
 * 高端汽车类工厂
 */
public class BLCarFactory implements CarFactory {
 
	@Override
	public Engine createEngine() {
		return new BLEngine();
	}
	@Override
	public Seat createSeat() {
		return new BLSeat();
	}
}

低档汽车工厂类

	/**
     * 低档汽车工厂类
     */
    public class DZCarFactory implements CarFactory {

        @Override
        public Engine createEngine() {
            return new DZEngine();
        }
        @Override
        public Seat createSeat() {
            return new DZSeat();
        }

小总结

简单工厂:不符合开闭原则,但是平常用的多,适合类少情况
工厂方法:适合增加产品,但是不能多,容易类膨胀
抽象工厂:不能增加产品,适合增加产品族

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值