设计模式:工厂模式
设计思路:①Shoe.java ———— 设计接口,也就是零件。接口不做修改,供后续扩展出来的部件使用①Shoe.java
工厂模型的最基础接口,抽象出工厂中所有零件所共有的属性。本例中以鞋为代表,抽象出鞋的鞋名、类型以及价格三个公有的属性。
public interface Shoe
{
public String getName();
public String getType();
public int getValue();
}
MenShoe.java
第一次对接口进行实现,也就是第一次扩展。本例是在对鞋接口不修改的情况下,扩展出男鞋和女鞋两个大的分类,并重载接口中的方法,以及新增每个分类特有的方法。
public class GirlShoe implements Shoe
{
private String GirlShoe_name;
private String GirlShoe_type;
private int GirlShoe_value;
public GirlShoe(String name2, String type2, int value2)
{
this.GirlShoe_name = name2;
this.GirlShoe_type = type2;
this.GirlShoe_value = value2;
}
@Override
public String getName()
{
return this.GirlShoe_name;
}
@Override
public String getType()
{
return this.GirlShoe_type;
}
@Override
public int getValue()
{
return this.GirlShoe_value;
}
public void setName(String name)
{
this.GirlShoe_name = name;
}
public void setType(String type)
{
this.GirlShoe_type = type;
}
public void setValue(int value)
{
this.GirlShoe_value = value;
}
}
public class MenShoe implements Shoe
{
private String MenShoe_name;
private String MenShoe_type;
private int MenShoe_value;
public MenShoe(String name1, String type1, int value1)
{
this.MenShoe_name = name1;
this.MenShoe_type = type1;
this.MenShoe_value = value1;
}
@Override
public String getName()
{
return this.MenShoe_name;
}
@Override
public String getType()
{
return this.MenShoe_type;
}
@Override
public int getValue()
{
return this.MenShoe_value;
}
}
对两个分类进行再次扩展,以鞋为例,如果想给鞋加上一些折扣的新属性,有3种情况需要考虑:
(1)在Shoe接口中新增折扣功能
(2)在ManShoe和GirlShoe两类中新增折扣功能
(3)新增两个折扣类继承前两个分类
根据开闭原则,在不修改原代码的情况下,新增折扣类是最符合原则的方式。因此新增两个折扣类继承前两类,扩展出折扣功能。
public class GirlShoe_PriceCut extends GirlShoe
{
public GirlShoe_PriceCut(String name2, String type2, int value2)
{
super(name2, type2, value2);
}
public int getValue()
{
int primeCost = super.getValue();
int cutPrice=0;
if(primeCost > 200)
{//如果原价大于200元,则打7.5折
cutPrice = primeCost*75/100;
System.out.println("如果原价大于200元,则打7.5折");
}
if(primeCost > 150)
{//如果原价大于150元,则打8折
cutPrice = primeCost*80/100;
System.out.println("如果原价大于150元,则打8折");
}
else
{//其他,打8.5折
cutPrice = primeCost*85/100;
System.out.println("其他,则打8.5折");
}
return cutPrice;
}
}
public class MenShoe_PriceCut extends MenShoe
{
public MenShoe_PriceCut(String name1, String type1, int value1)
{
super(name1, type1, value1);
}
public int getValue()
{
int primeCost = super.getValue();
int cutPrice = 0;
if(primeCost > 200)
{//如果原价大于200元,则打8折
cutPrice = primeCost*80/100;
}
if(primeCost > 150)
{//如果原价大于150元,则打8.5折
cutPrice = primeCost*85/100;
}
else
{//其他,打9折
cutPrice = primeCost*90/100;
}
return cutPrice;
}
}
总结:
根据开闭原则的概念——软件实体应当对外扩展开放,对修改关闭。在设计软件时,需要抽象出某一实体就最基础的属性,作为外界的接口,由具体实现接口的类重载方法。若要新增该实体中某个特殊个体的功能,则可以新增一类继承该特殊个体。这样设计软件,扩展性强,功能单一不复杂,出现问题容易发现。