这篇文章是继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类,皮帽工行,就可以在消费类里边直接获得到了!!
以上为个人所学和总结,如果那里不对,希望看到的大佬指正批评!