设计模式->创建型模式->工厂方法模式

1.定义:定义一个用于创建对象的单元,让子类决定实例化那个具体的对象,该模式是一个类的实例化延迟到子类

2.UML


3.理论基础:里氏替换原则,继承,多态

4.涉及角色:

        抽象产品:某类产品的抽象,主要定义了产品具有的属性和行为

       抽象产品工厂:定义创建某类抽象产品的方法,返回值为抽象产品类型,该方法由具体的产品工厂实现

        产品工厂:该模式的核心,主要负责产品的创建,创建方法返回值为抽象产品,包含多个api,每个api决定创建具体的产品实力

        具体产品:抽象产品的子类

5.优点

        1.客户端只负责消费对象,不关心对象的创建细节,明确了各自的职责.有利于整体结构的优化

        2.工厂类中不需要包含大量的逻辑

        3.方法内部实现高内聚低耦合

6.缺点

       1. 违背开闭原则。后续其他具体产品加入时需要增加新的API以便生成新的产品对象,随着具体产品的增加工厂类中的API会越来越多,后续该类会越来越臃肿。针对于该缺点可以采用简单工厂中提到的反射+范型进行优化

       2.工厂方法一般都是静态的,无法被子类重载/重写,不具有扩展性

7.使用场景

        1.系统中抽象产品的种类以及具体产品的种类不多且固定

        2.不关心对象的创建,只负责消费对象

8.Code

//抽象产品

package com.patterns.build.method.factory.common;

public interface Animal {
    public void eat(String food);
}

//具体产品

package com.patterns.build.method.factory.version1;

import com.patterns.build.method.factory.common.Animal;

public class Fish implements Animal {
    @Override
    public void eat(String food) {
        System.out.println(this.getClass().getSimpleName() + " eat " + food);
    }
}


package com.patterns.build.method.factory.version1;

import com.patterns.build.method.factory.common.Animal;

public class Dog implements Animal{
    @Override
    public void eat(String food) {
        System.out.println(this.getClass().getSimpleName() + " eat " + food);
    }
}

//工厂方法

package com.patterns.build.method.factory.version1;

import com.patterns.build.method.factory.common.Animal;

public class MethodFactory {

    public static Animal getDog() {
        return new Dog();
    }

    public static Animal getFish() {
        return new Fish();
    }
}

//客户端

package com.patterns.build.method.factory.version1;

import com.patterns.build.method.factory.common.Animal;

public class MethodFactory {

    public static Animal getDog() {
        return new Dog();
    }

    public static Animal getFish() {
        return new Fish();
    }
}
工厂方法模式标准版

2.UML


3.优点

        1.客户端只负责消费对象,不关心对象的创建细节.

        2.工厂类中不需要包含大量的逻辑

        3.方法内部实现高内聚低耦合

        4.遵循单一职责&开闭原则

        5.对象的实例化延迟到子类

4.缺点

       1. 随着具体产品的增加,工厂会越来越多,导致系统存在大量的工厂

       2.工厂方法一般都是静态的,无法被子类重载/重写,不具有扩展性

5.使用场景

        1.系统中抽象产品的种类以及具体产品的种类不多且固定

        2.不关心对象的创建,只负责消费对象

6.Code

//具体产品

package com.patterns.build.method.factory.version2;

import com.patterns.build.method.factory.common.Animal;

public class Cat implements Animal {
    @Override
    public void eat(String food) {
        System.out.println(this.getClass().getSimpleName() + " eat " + food);
    }
}



package com.patterns.build.method.factory.version2;

import com.patterns.build.method.factory.common.Animal;

public class Person implements Animal{
    @Override
    public void eat(String food) {
        System.out.print(this.getClass().getSimpleName() + " eat " + food);
    }
}


//抽象工厂,定义了产生某类产品的具体接口,由于该特性实现了对象实例化延迟到子类,同时也实现了父类的复用

package com.patterns.build.method.factory.version2;

import com.patterns.build.method.factory.common.Animal;


public interface IAnimalFactory {
    public Animal getInstance();
}

//具体工厂,负责生成一类具体的产品,遵循单一职责,由于每个工厂类只能生成某类具体产品的特性奠定了可扩展的基础

package com.patterns.build.method.factory.version2;

import com.patterns.build.method.factory.common.Animal;

public class CarFactory implements IAnimalFactory {

    private String name;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public Animal getInstance() {
        return new Cat();
    }
}


package com.patterns.build.method.factory.version2;

import com.patterns.build.method.factory.common.Animal;


public class PersonFactory implements IAnimalFactory {

    @Override
    public Animal getInstance() {
        return new Person();
    }
}
//客户端

package com.patterns.build.method.factory.version2;

public class Cilent {
    public static void main(String[] args) {
        IAnimalFactory factory = new CarFactory();
        factory.getInstance().eat("Fish");

        factory = new PersonFactory();
        factory.getInstance().eat("Food");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值