设计模式之简单工厂、工厂方法、抽象工厂模式

二十三种设计模式分类

创建型设计模式

和对象的创建有关,共5种:
单例模式工厂方法模式抽象工厂模式,建造者模式,原型模式

结构型设计模式

解决模块之间的耦合问题,共7种:
适配器模式装饰者模式代理模式外观模式桥接模式组合模式享元模式

行为型设计模式

处理类或者对象如何交互,如何分配职责,11种:
策略模式模板方法模式观察者模式迭代器模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,中介者模式,解释器模式。

工厂模式与build 模式差异

关注点build模式工厂模式
创建对象内部组件构建过程整体对象构建
对象组装手、脚、头、躯干、飞翔、内裤外穿直接生产超人

简单工厂模式

构成

  1. 1个抽象产品类角色
  2. 多个具体产品类角色
  3. 1个工厂类角色
  4. 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个抽象产品类角色
  2. 多个具体产品类角色
  3. 1个抽象工厂类角色
  4. 多个具体工厂类角色
  5. 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();
    }
}

抽象工厂模式

关注点工厂方法模式抽象工厂模式
等级结构一个产品等级结构面向多个产品的等级结构
抽象产品类一个抽象产品类多个抽象产品类
具体产品类可以派生多个具体产品类每个抽象产品类都可以派生多个具体产品类
抽象工厂类一个抽象工厂类一个抽象工厂类
具体工厂类可派生多个具体工厂类可派生多个具体工厂类
生产创建每个工厂类只能创建一个具体产品每个工厂可以创建多个具体产品

上述比对,可以这样理解,如果产品单一、则适合工厂方法。如果产品较多,则适合抽象工厂模式。

构成

  1. n个抽象产品类角色
  2. 每个抽象产品类有多个具体产品类角色
  3. 1个抽象工厂类角色
  4. 多个具体工厂类角色
  5. 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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值