设计模式在之前学习过,但是因为对于代码还不够熟悉,对于UML图的理解也不是很到位,而且UML图应用到代码中也是稀里糊涂的,所以应用时还需要再次学习设计模式。
上篇博客概念和UML图分析比较多,这次主要就是在代码上的实现
简单工厂
例子:一个人要去餐馆可以吃饭喝饮料,餐馆就是做要创建对象的父类,米饭、饮料就是具体子类对象,简单工厂模式是核心,通过它来创建实例。UML图如下:
Restaurant:创建实例的父类或接口
/*
* 所有实例公共接口或父类
*/
public abstract class Restaurant {
public abstract void doing();
}
Eat和Drink:Restaurant的具体实现类
/*
* 创建的具体子类
*/
public class Eat extends Restaurant{
@Override
public void doing() {
System.out.println("吃米饭");
}
}
public class Drink extends Restaurant{
@Override
public void doing() {
System.out.println("喝饮料");
}
}
简单工厂:创建所有实例的内部逻辑
/*
* 简单工厂:根据传入参数创建具体子类实现类
*/
public class SimpleFactory {
public Restaurant createRestaurant(String type){
switch(type){
case "吃":
return new Eat();
case "喝":
return new Drink();
default:
break;
}
return null;
}
}
Demo:创建实例,调用方法
public class demo {
public static void main(String[] args) {
//创建简单工厂对象
SimpleFactory simpleFactory=new SimpleFactory();
//调用工厂对象中的方法并传参"吃",返回为Restaurant对象
Restaurant createRestaurant = simpleFactory.createRestaurant("吃");
//Restaurant对象调用本身方法
createRestaurant.doing();
}
}
控制台上输出:
由此我们可以看到简单工厂就是解耦合的,动态的实例化不同的对象,但是当需要一个新实现类时,需要修改工厂中的内容,这个符合我们的开放-封闭原则。于是引出工厂方法模式。
工厂方法
FactoryMethod:定义工厂抽象类
/*
* 定义抽象工厂
*/
public abstract class FactoryMethod {
public abstract Restaurant createRestaurant();
}
EatFactory、DrinkFactory:定义具体工厂方法
/*
* EatFactory:定义具体工厂方法
*/
public class EatFactory extends FactoryMethod {
@Override
public Restaurant createRestaurant() {
return new Eat() ;
}
}
/*
* DrinkFactory:定义具体工厂方法
*/
public class DrinkFactory extends FactoryMethod{
@Override
public Restaurant createRestaurant() {
return new Drink();
}
}
Demo:应用多态,创建实例,调用方法
public class demo {
public static void main(String[] args) {
//多态:创建EatFactory()对象
FactoryMethod eatFactory = new EatFactory();
//多态:EatFactory调用方法创建Restaurant对象
Restaurant createRestaurant = eatFactory.createRestaurant();
//具体实现类调用方法
createRestaurant.doing();
}
}
控制台显示:
由此可知工厂模式当需要增加如:唱歌时,可以直接增加一个唱歌工厂和一个唱歌实现类,这样就满足了工厂的开放封闭原则。
工厂方法其实就是简单工厂的升级版本的,让接口依赖接口,抽象类依赖于抽象类,所有实现类的实现都是由具体工厂去创建对象,调用方法实现。最后还是得多实践。