简单工厂、工厂方法、抽象工厂
二十三种设计模式分类
创建型设计模式
和对象的创建有关,共5种:
单例模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式。
结构型设计模式
解决模块之间的耦合问题,共7种:
适配器模式,装饰者模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
行为型设计模式
处理类或者对象如何交互,如何分配职责,11种:
策略模式,模板方法模式,观察者模式,迭代器模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,中介者模式,解释器模式。
工厂模式与build 模式差异
关注点 | build模式 | 工厂模式 |
---|---|---|
创建 | 对象内部组件构建过程 | 整体对象构建 |
对象 | 组装手、脚、头、躯干、飞翔、内裤外穿 | 直接生产超人 |
简单工厂模式
构成
- 1个抽象产品类角色
- 多个具体产品类角色
- 1个工厂类角色
- 1个具体使用
示例
抽象产品类
public abstract class S_AudiCar {
// 抽象方法,可以开走
public abstract void drive();
// 抽象方法,可以自动巡航
public abstract void setNavigation();
}
具体产品类
public class S_AudiQ3 extends S_AudiCar {
@Override
public void drive() {
System.out.println("Q3 启动了");
}
@Override
public void setNavigation() {
System.out.println("Q3 开始自适应驾驶了");
}
}
public class S_AudiQ5 extends S_AudiCar {
@Override
public void drive() {
System.out.println("Q5 启动了");
}
@Override
public void setNavigation() {
System.out.println("Q5 开始自适应驾驶了");
}
}
工厂类
public class S_AudiFactory {
public static final int TYPE_Q3 = 1;
public static final int TYPE_Q5 = 2;
public static S_AudiCar getAudiCar(int type) {
switch (type) {
case TYPE_Q3:
return new S_AudiQ3();
case TYPE_Q5:
return new S_AudiQ5();
default:
break;
}
return null;
}
}
具体使用
public class S_FactoryClass {
public static void main(String[] args) {
S_AudiFactory factory = new S_AudiFactory();
S_AudiCar audiQ3 = factory.getAudiCar(factory.TYPE_Q3);
S_AudiCar audiQ5 = factory.getAudiCar(factory.TYPE_Q5);
}
}
工厂方法模式
简单工厂的仅一步深化, 在工厂方法模式中,不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说每个对象都有一个与之对应的工厂。
关注点 | 工厂方法模式 | 简单工厂模式 |
---|---|---|
创建 | 一个对象对应一个工厂 | 多个对象共使用一个工厂 |
对象 | 具体工厂生产 | switch case区分生产 |
构成
- 1个抽象产品类角色
- 多个具体产品类角色
- 1个抽象工厂类角色
- 多个具体工厂类角色
- 1个具体使用
示例
抽象产品类
//汽车抽象产品类
public abstract class M_AudiCar {
// 抽象方法,可以开走
public abstract void drive();
// 抽象方法,可以自动巡航
public abstract void setNavigation();
}
具体产品类
public class M_AudiQ3 extends M_AudiCar {
@Override
public void drive() {
System.out.println("Q3 启动了");
}
@Override
public void setNavigation() {
System.out.println("Q3 开始自适应了");
}
}
public class M_AudiQ5 extends M_AudiCar {
@Override
public void drive() {
System.out.println("Q5 启动了");
}
@Override
public void setNavigation() {
System.out.println("Q5 开始自适应了");
}
}
抽象工厂类
public abstract class M_AudiFactory {
public abstract M_AudiCar createAudiCar();
}
具体工厂类
public class M_AudiQ3Factory extends M_AudiFactory {
@Override
public M_AudiCar createAudiCar() {
return new M_AudiQ3();
}
}
public class M_AudiQ5Factory extends M_AudiFactory {
@Override
public M_AudiCar createAudiCar() {
return new M_AudiQ5();
}
}
具体使用
public class M_FactoryClass {
public static void main(String[] args){
M_AudiFactory audiQ3Factory = new M_AudiQ3Factory();
audiQ3Factory.createAudiCar().drive();
M_AudiFactory audiQ5Factory = new M_AudiQ5Factory();
audiQ5Factory.createAudiCar().drive();
}
}
抽象工厂模式
关注点 | 工厂方法模式 | 抽象工厂模式 |
---|---|---|
等级结构 | 一个产品等级结构 | 面向多个产品的等级结构 |
抽象产品类 | 一个抽象产品类 | 多个抽象产品类 |
具体产品类 | 可以派生多个具体产品类 | 每个抽象产品类都可以派生多个具体产品类 |
抽象工厂类 | 一个抽象工厂类 | 一个抽象工厂类 |
具体工厂类 | 可派生多个具体工厂类 | 可派生多个具体工厂类 |
生产创建 | 每个工厂类只能创建一个具体产品 | 每个工厂可以创建多个具体产品 |
上述比对,可以这样理解,如果产品单一、则适合工厂方法。如果产品较多,则适合抽象工厂模式。
构成
- n个抽象产品类角色
- 每个抽象产品类有多个具体产品类角色
- 1个抽象工厂类角色
- 多个具体工厂类角色
- 1个具体使用
每个具体工厂可以创建多种(n种)具体产品
示例
抽象产品类
抽象产品类角色a
//汽车抽象产品类
public abstract class M_AudiCar {
// 抽象方法,可以开走
public abstract void drive();
// 抽象方法,可以自动巡航
public abstract void setNavigation();
}
抽象产品类角色b
//引擎抽象产品类
public abstract class A_Engine {
public abstract void setEngine();
}
具体产品类
具体产品a
public class A_AudiQ3 extends A_AudiCar {
@Override
public void drive() {
System.out.println("Q3 启动了");
}
@Override
public void setNavigation() {
System.out.println("Q3 自适应了");
}
}
public class A_AudiQ5 extends A_AudiCar {
@Override
public void drive() {
System.out.println("Q5 启动了");
}
@Override
public void setNavigation() {
System.out.println("Q5 自适应了");
}
}
具体产品b
public class A_AudiEngine extends A_Engine {
@Override
public void setEngine() {
System.out.println("奥迪发动机");
}
}
public class A_VWEngine extends A_Engine{
@Override
public void setEngine() {
System.out.println("大众发动机");
}
}
抽象工厂类
public abstract class A_AudiFactory {
public abstract A_AudiCar createCar();
public abstract A_Engine createEngine();
}
具体工厂类
public class A_AudiQ5CarFactory extends A_AudiFactory {
@Override
public A_AudiCar createCar() {
return new A_AudiQ5();
}
@Override
public A_Engine createEngine() {
return new A_AudiEngine();
}
}
public class A_AudiQ3CarFactory extends A_AudiFactory {
@Override
public A_AudiCar createCar() {
return new A_AudiQ3();
}
@Override
public A_Engine createEngine() {
return new A_VWEngine();
}
}
具体使用者
public class A_FactoryClass {
public static void main(String[] args){
A_AudiFactory q3Car = new A_AudiQ3CarFactory();
q3Car.createCar().drive();
q3Car.createEngine().setEngine();
A_AudiFactory q5Car = new A_AudiQ5CarFactory();
q5Car.createCar().drive();
q5Car.createEngine().setEngine();
}
}