设计模式 --- 工厂模式factory ---- 创建型

本文详细介绍了设计模式中的工厂模式,包括定义、应用场景、简单工厂、工厂方法和抽象工厂。简单工厂适用于对象不频繁扩展的情况,而工厂方法和抽象工厂则提供更高的扩展性和灵活性,分别适用于产品族的单一生产和多个产品族的生产。抽象工厂模式虽然增加新的产品等级结构较为复杂,但能确保同一产品族的对象一起工作。

参考:https://www.zhihu.com/question/20367734

定义

任何可以产生对象的方法或者类,都可以吃称之为工厂

单例也是一种工厂,灵活控制生产过程,权限,修饰,日志

专门生产对象,把对象的实例化和初始化都封装起来

只需要获取相关对象实例,而不关心实际的生产过程

应用场景

1.任意定制交通工具
2.任意定制生产过程
3.任意定制产品一族

简单工厂

常用于具体的工具很少扩展的情况下,因为内部实现简单,直接可以使用,如果需要扩展,则需要修改内部实现,就违反了开闭原则

优点:简单粗暴,工厂类中实现了返回相关实例

缺点:难以扩展

代码块

定义两个类

public class Car{

    public void go() {
        System.out.println("car go .......");
    }
}
public class Broom {

    public void go() {
        System.out.println("bromm go ....");
    }
}

工厂方法调用

public class SimpleFactory {

    public Car createCar() {
        //before processing
        return new Car();
    }

    public Broom createBroom() {
        return new Broom();
    }
}

以上是简单工厂的代码

工厂方法

优点

1.扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

2.屏蔽产品的具体实现,调用者只关心产品的接口。

缺点

1.每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖

代码块

定义接口

public interface IFactory {
    void CreateOption();
}
public interface IProduct {
    void add();
}

定义两个实现类

public class One implements IFactory {
    @Override
    public IProduct CreateOption() {
        return new OneProduct();
    }
}
public class OneProduct implements IProduct {
    @Override
    public void add() {
        System.out.println("this is one product");
    }
}

具体调用实现

public class Main {

    public static void main(String[] args) {
        IFactory one = new One();
        one.CreateOption().add();
    }
}

以上是工厂方法的实现代码

抽象工厂

定义多个抽象工厂产品类,统一由抽象工厂A管理,拥有不同的产品族

工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是抽象工厂

优点

1.抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

2.当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。

3.增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。

缺点

增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”

代码块

定义一个抽象工厂

public abstract class AbstractFactory {
    abstract Food createFood();
    abstract Vehicle createVehicle();
}

定义两个实现

public class MagicFactory extends AbstractFactory {
    @Override
    Food createFood() {
        return new Bread();
    }

    @Override
    Vehicle createVehicle() {
        return new Broom();
    }
}
public class ModernFactory extends AbstractFactory {
    @Override
    Food createFood() {
        return new Bread();
    }

    @Override
    Vehicle createVehicle() {
        return new Car();
    }
}

定义具体的产品抽象类

public abstract class Vehicle {
    abstract void go();
}
public abstract class Food {
    abstract void printName();
}

定义具体实现产品类的方法

public class Car extends Vehicle {

    public void go() {
        System.out.println("car go .......");
    }
}
public class Broom extends Vehicle {

    public void go() {
        System.out.println("bromm go ....");
    }
}
public class Bread extends Food{

    public void printName() {
        System.out.println("is print name now");
    }
}

具体调用

public class Main {

    public static void main(String[] args) {
        AbstractFactory f = new ModernFactory();
        Vehicle c = f.createVehicle();
        c.go();
        Food b = f.createFood();
        b.printName();
    }
}

一些知识点

抽象工厂是类,工厂方法是方法

工厂方法一个工厂只能生产一种产品。抽象工厂一个工厂可以生产一类产品

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值