最近经理让我们整理一下java的设计模式看了许多网上的PPT,文档,感觉这些模式还是写在例子中才能更快的理解它的用法。
好了废话不多说了直接上代码
假如我们要做个生产鱼的工厂
1.首先我们需要实体类鱼作为我们要生产的东西
public abstract class Fish {
public abstract String introduce();//介绍
public abstract String swim();//游泳
public abstract String eat();//吃饭
}
在这里我们的鱼有介绍,游泳,吃饭三个方法,下面我们做出他们的具体实例
素食鱼VegetarianFish
public class VegetarianFish extends Fish{
@Override
public String swim() {
return "游得缓慢";
}
@Override
public String eat() {
return "只吃一些草或藻类植物";
}
@Override
public String introduce() {
return "我是素食鱼属性如下:";
}
}
肉食鱼CarnivorousFish
public class CarnivorousFish extends Fish{
@Override
public String swim() {
return "能飞快的游动并且在最短时间内抓住猎物";
}
@Override
public String eat() {
return "只对肉感兴趣";
}
@Override
public String introduce() {
return "我是肉食鱼属性如下:";
}
}
2.有了我们的产品模型我们需要一个工厂来生产它
我们的工厂如下:
public class Factory {
public Fish create(String need) {
switch (need) {
case "meat":
return new CarnivorousFish();
case "greens":
return new VegetarianFish();
}
return null;
}
}
上面就是我们的工厂根据客户的需求生产出我们需要的产品(Fish)
3.最后就是我们的客户买鱼的过程了
代码如下
public class Test {
public static void main(String[] args) {
Factory facctory=new Factory();
Fish fish=facctory.create("meat");
System.out.println(fish.introduce()+"\n吃饭:"+fish.eat()+"\n游泳:"+fish.swim());
Fish fish2=facctory.create("greens");
System.out.println(fish2.introduce()+"\n吃饭:"+fish2.eat()+"\n游泳:"+fish2.swim());
}
}
到此我们的工厂就创建完了
总结一下我们的工厂模式即将一个对象(fish)推给了另一个对象(factory)创建有什么好处呢?
1.解除了客户跟产品(Fish)之间的耦合
2.工厂跟客户是1对多的关系,工厂跟产品也是1对多关系,这样我们的工厂既可以生产多种样品(有许多Fish的实现),也可以对应多个客户(根据客户的不同需求生产不同的Fish)
3.提高了聚合度(Fish的职责根据自身特点提供相应功能,factory的职责是根据用户的需求)
缺点
不完全符合OCP开放封闭原则(扩展应开放,修改应封闭),要增加一个新的产品类,必须相应修改工厂类的方法。
Java设计原则
1.高内聚,低耦合
2.单一职责