Looks like you actually can.
I put this code in remix:
contract target{
uint public myUint;
constructor() {
myUint = 1;
}
function destroy() external {
selfdestruct(payable(address(0)));
}
}
contract Example {
function deploy(uint _salt) public returns(address newContract) {
bytes memory bytecode = type(target).creationCode;
assembly {
newContract := create2(0, add(bytecode, 32), mload(bytecode), _salt)
}
}
}
And I can deploy a target contract with the deploy() function (contract is at address 0x733C8B6...). I can call the myUint to check that it's = 1. Then I can call destroy() of the target contract and check that myUint = 0 since the contract was destroyed.
From there, I can call the deploy() function again and the newly created contract will also be at address 0x733C8B6!.
Try it yourself.
Hope this helps!