工厂方法模式及策略模式
本文主要内容
- 工厂方法介绍
- 工厂方法
- 抽象工厂介绍
- 抽象工厂
- 策略模式
本文继续介绍相关设计模式,本期介绍工厂方法模式、抽象工厂模式以及策略模式。工厂方法较为常见,策略模式非常有意思,本人最先做的一个app重构用的就是策略模式,印象深刻
1、工厂方法介绍
工厂方法UML图工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪个类
其实工厂方法模式,在工作中胜利太多了,很多某某Factory的相关类,都是这种设计模式。在任何需要生成复杂对象的地方,都可以使用工厂方法模式。需要注意的是,它和抽象工厂模式的差别。
2、工厂模式
工厂方法模式比较简单,直接上代码:
public abstract class Product {
public abstract void method();
}
public class ProductA extends Product{
@Override
public void method() {
System.out.println("i am a");
}
}
public class ProductB extends Product{
@Override
public void method() {
System.out.println("i am B");
}
}
public abstract class Factory {
public abstract <T extends Product> T create(Class<T> clz);
}
public class ConcreateFactory extends Factory{
@Override
public <T extends Product> T create(Class<T> clz) {
Product p = null;
try {
p = (Product) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
}
return (T) p;
}
public static void main(String[] args) {
Factory factory = new ConcreateFactory();
Product p = factory.create(ProductB.class);
p.method();
p = factory.create(ProductA.class);
p.method();
}
}
3、抽象工厂定义
抽象工厂:为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类。
光从定义看,貌似与工厂方法没什么差别。它们定义之间的差别,只有个别词语的差别。工厂方法是创建对象
,而抽象工厂是创建一组相关或者相互依赖的对象
,由此可见,如果是创建继承同一父类或者实现同一接口的对象,可用工厂方法,如果是创建不同的对象(对象之间有关联),则用抽象工厂
由UML图可见,抽象工厂不止有多个产品,还有多个工厂
4、抽象工厂
我们以生产Q3和Q7两种车型为例,介绍抽象工厂。
public abstract class CarFactory {
public abstract ITire createTire();
public abstract IEngine createEngine();
}
public interface ITire {
void tire();
}
public class SuvTire implements ITire{
@Override
public void tire() {
System.out.println("我是越野轮胎");
}
}
public class NormalTire implements ITire {
@Override
public void tire() {
System.out.println("我是普通轮胎");
}
}
public interface IEngine {
void engine();
}
public class NormalEngine implements IEngine{
@Override
public void engine() {
System.out.println("我是普通引擎");
}
}
public class ImportEngine implements IEngine{
@Override
public void engine() {
System.out.println("我是进口引擎");
}
}
public class Q3Factory extends CarFactory{
@Override
public ITire createTire() {
return new NormalTire();
}
@Override
public IEngine createEngine() {
return new NormalEngine();
}
}
public class Q7Factory extends CarFactory{
@Override
public ITire createTire() {
return new SuvTire();
}
@Override
public IEngine createEngine() {
return new ImportEngine();
}
}
public class Client {
public static void main(String[] args) {
CarFactory q3 = new Q3Factory();
q3.createEngine().engine();
q3.createTire().tire();
System.out.println("-------------");
CarFactory q7 = new Q7Factory();
q7.createEngine().engine();
q7.createTire().tire();
}
}
5、策略模式
策略模式:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
设计模式学到这,才算是有点意思,前面写的各种模式貌似非常简单,策略模式其实也很简单。就是将不同的实现封装在不同的子类中,以注入方式实现替换不同实现。如果在代码中看到很多if else或者switch,可以考虑使用策略模式重构。
我们常说代码的可扩展性,什么叫可扩展性,就是添加新功能更加容易。比如现在我们有一个音乐app,app有两个乐库来源,一个是虾米音乐,另一个是酷我音乐,此时我们应该怎么做呢?如果我们事先定义了一个音乐源的超类,然后分别以子类形式实现引入虾米和酷我,是不是就完成了这个功能。这就叫做可扩展性,因为你不确定以后还会不会接入其它音乐源。并且修改其中一个类不会影响另一个类,这个叫健壮性。重构代码中两个非常重要的特性,可扩展和健壮性都能在策略械中得到淋漓尽致的体现!
策略模式UML图关于策略模式相关的代码,本文不再贴了,其实非常简单,上文以音乐app为例,基本已经说明此问题了。