java开发,必须要懂的23种设计模式——工厂模式(工厂方法模式)

提醒:

这篇文章是继java开发,必须要懂的23种设计模式——工厂模式(简单工厂模式)文章后,进阶版工厂模式的讲解,建议先浏览一下这篇文章,再继续看下去。

了解之后,我们来说说怎么去让工厂模式去符合开闭原则!

分析:

我们通过简单工厂模式知道,不满足开闭原则的罪魁祸首,是工厂类里边的判断语句。只要增加了一个商品,就必须增加一个判断语句,以及相应的实例化和初始化代码,我们把代码写死了!

 

那么,怎么把判断语句去掉?

 

想去掉判断语句,我们得想一想:为什么需要判断语句?

因为工厂生产了两件商品,消费者只要一个商品,就需要去判断一下,消费者究竟要那个。

 

那,我们把工厂拆分一下,分成钱包制造厂和大衣制造厂。让它们都只生产一件商品,消费者来消费,不就不需要判断了!

完美!

动工,撸代码!

江南皮革厂总厂(接口)

package factory.methodFactory;

public interface 江南皮革厂总厂 {
	Skin getSkin();
}

江南皮革厂分厂_____大衣制造厂(实现工厂接口的工厂)

package factory.methodFactory;

import factory.methodFactory.Coat;

public class 江南皮革厂分厂_____大衣制造厂 implements 江南皮革厂总厂 {

	@Override
	public Skin getSkin() {
		return new Coat("貂皮大衣","80000¥");
	}

}

江南皮革厂分厂_____钱包制造厂(实现工厂接口的工厂)

package factory.methodFactory;

import factory.methodFactory.Wallet;

public class 江南皮革厂分厂_____钱包制造厂 implements 江南皮革厂总厂 {

	@Override
	public Skin getSkin() {
		return new Wallet("真皮钱包","800¥");
	}

}

皮制品要遵守一定的规范——要有名字和价格(皮制品接口)

package factory.methodFactory;

public interface Skin {
	public void name();
	public void pice();
}

皮大衣(实现皮制品接口的类)

package factory.methodFactory;

public class Coat implements Skin {
	
	public String name;
	public String pice;
	
	public Coat(String name ,String pice) {
		this.name=name;
		this.pice=pice;
	}
	
	@Override
	public void name() {
		System.out.println("名字:"+name);
	}

	@Override
	public void pice() {
		System.out.println("价格:"+pice);
	}

}

皮钱包(实现皮制品接口的类)

package factory.methodFactory;

public class Wallet implements Skin {
	
	public String name;
	public String pice;
	
	public Wallet(String name ,String pice) {
		this.name=name;
		this.pice=pice;
	}
	
	@Override
	public void name() {
		System.out.println("名字:"+name);
	}

	@Override
	public void pice() {
		System.out.println("价格:"+pice);
	}

}

消费者

package factory.methodFactory;

public class Consumer {

	public static void main(String[] args) {
		Skin wallet =new 江南皮革厂分厂_____钱包制造厂().getSkin();
		
		wallet.name();
		wallet.pice();
		
		Skin coat = new 江南皮革厂分厂_____大衣制造厂().getSkin();
		
		coat.name();
		coat.pice();
		
	}

}

运行结果:

名字:真皮钱包
价格:800¥
名字:貂皮大衣
价格:80000¥

测试:

按照咱们的推论,现在应该已经满足开闭原则了。咱们添加个商品试试。

皮帽(实现皮制品接口的类)

package factory.methodFactory;

public class Hat implements Skin {
	
	public String name;
	public String pice;
	
	public Hat(String name ,String pice) {
		this.name=name;
		this.pice=pice;
	}
	
	@Override
	public void name() {
		System.out.println("名字:"+name);
	}

	@Override
	public void pice() {
		System.out.println("价格:"+pice);
	}

}

江南皮革厂分厂_____皮帽制造厂(实现工厂接口的工厂)

package factory.methodFactory;

public class 江南皮革厂分厂_____皮帽制造厂 implements 江南皮革厂总厂 {

	@Override
	public Skin getSkin() {
		return new Hat("皮帽","60¥");
	}

}

测试:

package factory.methodFactory;

public class Consumer {

	public static void main(String[] args) {
		Skin wallet =new 江南皮革厂分厂_____钱包制造厂().getSkin();

		wallet.name();
		wallet.pice();

		Skin coat = new 江南皮革厂分厂_____大衣制造厂().getSkin();

		coat.name();
		coat.pice();

		Skin hat = new 江南皮革厂分厂_____皮帽制造厂().getSkin();

		hat.name();
		hat.pice();

	}

}

运行结果:

名字:真皮钱包
价格:800¥
名字:貂皮大衣
价格:80000¥
名字:皮帽
价格:60¥

在没有改变原来代码的基础上,新增Cat类,皮帽工行,就可以在消费类里边直接获得到了!!

 

以上为个人所学和总结,如果那里不对,希望看到的大佬指正批评!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章