设计模式二、简单工厂模式——静态工厂模式
上一篇讲述了设计模式的原则,下面针对常用的设计模式进行描述
创建型模式:静态工厂模式、工厂方法模式、抽象工厂模式、单例模式、建造者模式
结构型模式:桥接模式、适配器模式、装饰器模式、代理模式、组合模式
行为型模式:模板方法模式、策略模式、观察者模式、责任链模式、命令模式、访问者模式
创建型模式:针对类创建所设计的模式
简单工厂模式
设计原则:
将类的创建统一到一个类内管理,类的创建过程对类的使用者透明。
示例
水果实体
public class Fruits {
private String name;
private String shape;
public Fruits(){
setName("水果");
setShape("无");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getShape() {
return shape;
}
public void setShape(String shape) {
this.shape = shape;
}
}
苹果实体
public class Apple extends Fruits { public Apple(){ setName("苹果"); setShape("圆的"); } }
橘子实体
public class Orange extends Fruits{ public Orange(){ setName("橘子"); setShape("圆的"); } }
没有实现静态工厂前,创建苹果和橘子示例
public class FruitsController {
public static void main(String[] args) {
Fruits apple=new Apple();
System.out.println(apple.getName());
Fruits orange=new Orange();
System.out.println(orange.getName());
}
}
创建静态工厂
public class FruitsFactory {
public final static int TYPE_APPLE=1;//苹果
public final static int TYPE_ORANGE=2;//橘子
public Fruits getFruit(int type){
if(TYPE_APPLE==type){
return new Apple();
}else if(TYPE_ORANGE==type){
return new Orange();
}
return new Fruits();
}
}
通过传入的水果类型返回创建的水果实体——类型为1则创建苹果,类型为2则创建橘子
通过静态工厂进行水果创建
public class FruitsController { public static void main(String[] args) { FruitsFactory factory=new FruitsFactory();
//通过水果类型创建水果 Fruits apple=factory.getFruit(FruitsFactory.TYPE_APPLE); System.out.println(apple.getName());
//通过橘子类型创建橘子 Fruits orange=factory.getFruit(FruitsFactory.TYPE_ORANGE); System.out.println(orange.getName()); } }
特点:
1、统一由工厂进行实体的创建,便于管理
2、创建水果实体前需要知道水果对应的类型
3、增加新的水果需要修改工厂代码:添加类型,增加逻辑判断
另一种通过方法替换类型来创建实体的静态工厂类
public class FruitsFactory2 { public Fruits getApple(){ return new Apple(); } public Fruits getOrange(){ return new Orange(); } }
通过该工厂创建实体
public class FruitsController { public static void main(String[] args) { FruitsFactory2 factory=new FruitsFactory2(); Fruits apple=factory.getApple(); System.out.println(apple.getName()); Fruits orange=factory.getOrange(); System.out.println(orange.getName()); } }
特点:
1、不需要类型进行判断,直接调用对应的方法进行实体创建
2、可以通过防范备注表明方法的用处
3、新增水果类型需要添加对应的方法
总结:
1、 静态工厂管理实体的创建,可以统一实体创建的管理,让使用者专注类的使用,透明类的创建过程。
2、静态工厂模式随着业务的新增需要修改代码
3、该模式不符合设计模式中:单一职责原则——一个水果工厂类管理多个水果实体的创建;开闭原则——每次业务新增都要修改代码