该模式定义了一些里而算法, 并将每个算法封装起来, 是他们可以互相替换, 且算法的变化不会影响使用算法的客户. 策略模式属于对象行为模式, 它通过对算法进行封装, 把使用该算法的责任和算法的实现分割开来, 并委派给不同的对象对这些算法进行管理
策略案例:
三种生物分别是猫, 狗, 人
三种生物对应分别吃不同的事物
Strategy类
public interface BiologicalStrategy {void show();
}
猫Concrete Strategy
public class CatStrategy implements BiologicalStrategy {@Overridepublic void show() {System.out.println("吃猫粮");}
}
狗Concrete Strategy
public class DogStrategy implements BiologicalStrategy {@Overridepublic void show() {System.out.println("吃狗粮");}
}
人Concrete Strategy
public class PersonStrategy implements BiologicalStrategy {@Overridepublic void show() {System.out.println("吃饭");}
}
Context类
public class FoodContect {private BiologicalStrategy biologicalStrategy;public void biologicalStrategyShow() {biologicalStrategy.show();}
}
main方法
public static void main(String[] args) {FoodContect catFood = new FoodContect(new CatStrategy());catFood.biologicalStrategyShow();System.out.println("====================");FoodContect dogFood = new FoodContect(new DogStrategy());dogFood.biologicalStrategyShow();System.out.println("====================");FoodContect personFood = new FoodContect(new PersonStrategy());personFood.biologicalStrategyShow();
}
在Java中, 万物接对象, 这些对象都需要创建, 如果创建的时候直接new该对象, 就会对该对象耦合严重, 加入我们要更换对象, 所有new对象的地方都需要修改一遍, 这显然违背了软件设计的开闭原则. 如果我们使用工厂来生产对象, 我们就只和工厂打交道就可以了, 彻底和对象解耦, 如果要更换对象, 直接在工厂里更换该对象即可, 达到了与对象解耦的目的; 所以说, 工厂模式最大的有点就是解耦
简单工厂模式不是一种设计模式, 反而是一种编程习惯
实现
simple_factory代码
public class SimpleFactory {public FoodContect createFood(String type) {FoodContect foodContect = null;foodContect = new FoodContect(new CatStrategy());return foodContect;}
}
main方法
public static void main(String[] args) {SimpleFactory simpleFactory = new SimpleFactory();BiologicalStrategy cat = simpleFactory.createFood("cat");cat.show();
}
我们可以通过工厂模式减少一定的耦合, 但是这里简单共产有产生了新的耦合, 违反了开闭原则, 但是我们只需要修改对应的工厂类的代码省去了其他的操作
优点
封装了创建对象的过程, 可以通过参数直接获取对象. 吧对象的创建和业务逻辑层分开, 这样以后就避免了修改客户代码, 如果要实现新产品直接修改工厂类, 而不需要在源代码中修改, 这样就降低了客户代码修改的可能性, 更加容易扩展
缺点
增加新产品时还是需要修改工厂类的代码, 违背了开闭原则
只是将简单工厂的方法变为静态方法这里不做具体介绍
- 对于以上简单工厂和静态工厂的缺点工厂方法模式就可以完美解决, 完全遵循开闭原则
- 定义一个用于创建兑现的接口, 让子类决定实例化哪个产品类对象. 工厂方法是一个产品类的实例化延迟到其工厂的子类
工厂方法
@NoArgsConstructor
@AllArgsConstructor
public class FactoryMethod {private FoodFactory foodFactory;public FoodFactory createFoodFactory() {return foodFactory;}
}
抽象工厂
public interface FoodFactory {BiologicalStrategy createFood();
}
具体工厂
// cat
public class CatFactory implements FoodFactory{@Overridepublic BiologicalStrategy createFood() {return new CatStrategy();}
}// dog
public class DogFactory implements FoodFactory {@Overridepublic BiologicalStrategy createFood() {return new DogStrategy();}
}// person
public class PersonFactory implements FoodFactory {@Overridepublic BiologicalStrategy createFood() {return new PersonStrategy();}
}
main方法(工厂加策略)
public static void main(String[] args) {FactoryMethod factoryMethod = new FactoryMethod(new CatFactory());FoodFactory foodFactory = factoryMethod.createFoodFactory();FoodContect foodContect = new FoodContect(foodFactory.createFood());foodContect.biologicalStrategyShow();
}
前面介绍的工厂方法模式中考虑到时一类产品的生产, 如电视机厂只生产电视机
这些工厂只生产同种类产品, 同种类产品成为同等级产品, 也就是说: 工厂方法模式只考虑生产同等级的产品, 但是在现实生活中许多工厂是综合工厂, 能生产多种类产品
是一种为访问类创建一个创建一组相关或相互依赖对象的接口
- 用途不一样
- 工厂是创建型模式,它的作用就是创建对象;
- 策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为;
- 关注点不一样
- 一个关注对象创建
- 一个关注行为的封装
- 解决不同的问题
- 工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。
- 策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。
- 工厂相当于黑盒子,策略相当于白盒子;