设计模式:工厂模式与抽象工厂模式


前言

  1. 设计模式来源?
    设计模式来自于建筑领域,作为软件工程的一个分支。1995年由GOF收集整理了23种设计模式并出版了《Design Patterns: Elements of Reusable Object-Oriented Software》一书。

  2. 什么是设计模式?
    设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。

  3. 为什么要使用设计模式(目的)?
    为了代码可重用性、增加可维护性,让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化。

  4. 怎么实现代码可重用性?
    遵循设计模式七大原则(单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、迪米特法则、合成/聚合复用原则)。


提示:以下是本篇文章正文内容,下面案例可供参考

一、工厂方法

又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。一种常用的对象创建型设计模式,此模式的核心精神是封装 类中不变的部分。

1、主要角色

  • 抽象工厂:描述具体工厂的公共接口
  • 具体工厂:描述具体工厂,创建产品的实例,供外界调用
  • 抽象产品:负责描述产品的公共接口
  • 具体产品:描述生产的具体产品

2、简单示例

举个简单易懂的例子:“假设”有生产苹果手机的加工厂(抽象工厂),可以生产出苹果5手机(抽象产品)。苹果5手机加工厂(具体工厂),只能生产内存32、64G的苹果5手机(具体产品)。
请添加图片描述

3、代码如下(示例):

产品

/**
 * 抽象产品-苹果手机
 */
public abstract class Iphone {
    public abstract void produce();
}

/**
 * 具体产品-苹果手机
 */
public class Iphone_5_32G extends Iphone {
    @Override
    public void produce() {
        System.out.println("生产一台苹果5-32G");
    }
}

public class Iphone_5_32G extends Iphone {
    @Override
    public void produce() {
        System.out.println("生产一台苹果5-32G");
    }
}

工厂
代码如下(示例):

//抽象工厂
public abstract class AbFactory {
    public abstract Iphone getProduct();
}

//具体工厂
public class Phone_5_32G_Factory extends AbFactory{
    @Override
    public Iphone getProduct() {
        return new Iphone_5_32G();
    }
}

//具体工厂
public class Phone_5_64G_Factory extends AbFactory{
    @Override
    public Iphone getProduct() {
        return new Iphone_5_64G();
    }
}

测试

public class Test {
    public static void main(String[] args) {
        AbFactory phone_5=new Phone_5_32G_Factory();
        phone_5.getProduct().produce();

        AbFactory phone_6=new Phone_5_64G_Factory();
        phone_6.getProduct().produce();
    }
}

生产一台苹果5-32G
生产一台苹果5-64G

二、抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。

1、主要角色

  • 抽象工厂:描述具体工厂的公共接口
  • 具体工厂:描述具体工厂,创建产品的实例,供外界调用
  • 抽象产品族:描述抽象产品的公共接口
  • 抽象产品:描述具体产品的公共接口
  • 具体产品:具体产品

2、简单示例

“假设”有各类的手机加工厂(抽象工厂),可以出售各类手机,如苹果手机(抽象产品族)。有苹果5,苹果6(抽象产品),比如常见的富士康(具体工厂),出售32G、64G内存(具体产品)。请添加图片描述

3、代码如下(示例):

产品

/**
 * 抽象产品族
 */
public abstract class Iphone {
    public abstract void produce();
}

//抽象产品
public abstract class Phone_5 extends Iphone {
    @Override
    public abstract void produce();
}

public abstract class Phone_6 extends Iphone {
    @Override
    public abstract void produce();
}

/**
 * 具体产品-苹果手机
 */
public class Phone_5_32G extends Phone_5 {
    @Override
    public void produce(){
        System.out.println("生产一台苹果5-32G");
    }
}

public class Phone_5_64G extends Phone_5 {
    @Override
    public void produce(){
        System.out.println("生产一台苹果5-64G");
    }
}


public class Phone_6_32G extends Phone_6 {
    @Override
    public void produce(){
        System.out.println("生产一台苹果6-32G");
    }
}


public class Phone_6_64G extends Phone_6 {
    @Override
    public void produce(){
        System.out.println("生产一台苹果6-64G");
    }
}

工厂
代码如下(示例):

//抽象工厂
public abstract class Factory {
    public abstract Iphone getIphone_32G();
    public abstract Iphone getIphone_64G();
}

//具体工厂
public class Phone_5_Factory extends Factory {

    @Override
    public Iphone getIphone_32G() {
        return new Phone_5_32G();
    }

    @Override
    public Iphone getIphone_64G() {
        return new Phone_5_64G();
    }
}

//具体工厂
public class Phone_6_Factory extends Factory {

    @Override
    public Iphone getIphone_32G() {
        return new Phone_6_32G();
    }

    @Override
    public Iphone getIphone_64G() {
        return new Phone_6_64G();
    }
}

测试

public class Test {
    public static void main(String[] args) {
        //抽象工厂
        Factory factory_5=new Phone_5_Factory();
        factory_5.getIphone_32G().produce();
        factory_5.getIphone_64G().produce();

        Factory factory_6=new Phone_6_Factory();
        factory_6.getIphone_32G().produce();
        factory_6.getIphone_64G().produce();
    }

}

生产一台苹果5-32G
生产一台苹果5-64G
生产一台苹果6-32G
生产一台苹果6-64G

总结

工厂方法:抽象工厂、具体工厂、抽象产品、具体产品
抽象工厂:抽象工厂、具体工厂、抽象产品族、抽象产品、具体产品

工厂方法:定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象

抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。

工厂方法模式解决了简单工厂模式的“开放 - 关闭原则
抽象工厂模式解决了工厂方法模式一个具体工厂只能创建一类产品

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值