工厂模式
本质:创建对象不使用new而使用工厂方法代替。
简单工厂模式
工厂所管理的类的统一接口:Product
public interface Product {
void work();
}
具体实现类:Phone和Computer
public class Computer implements Product {
@Override
public void work() {
System.out.println("computer work...");
}
}
public class Phone implements Product {
@Override
public void work() {
System.out.println("phone work...");
}
}
工厂类创建根据传入的名称创建对应产品:
public class SimpleFactory {
public static Product getProduct(String name){
switch (name){
case "phone":
return new Phone();
case "computer":
return new Computer();
default:
return null;
}
}
public static void main(String[] args) {
Product phone = SimpleFactory.getProduct("phone");
if (phone!=null){
phone.work();
}
}
}
优点:编写简单
缺点:每次新增一个产品类型都要改动getProduct()代码。
工厂方法模式
产品和简单工厂一样继承Product
新增接口 ProductFactory 用于生成产品
public interface ProductFactory {
Product getProduct();
}
新增实际产品的工厂
/**
* @author objcfeng
* @description 电脑工厂
* @date 2020/10/20
*/
public class ComputerFactory implements ProductFactory {
@Override
public Product getProduct() {
return new Computer();
}
}
public class PhoneFactory implements ProductFactory {
@Override
public Product getProduct() {
return new Phone();
}
}
测试类:
public class Main {
public static void main(String[] args) {
new PhoneFactory().getProduct().work();
}
}
相较于简单工厂模式来说,解决了对修改关闭的不支持的问题,但是代码更复杂。
抽象工厂模式
产品不需要统一的接口,因为若都实现统一的接口,在产品工厂生产产品时,不好做区分,需要传入参数做判断。
产品:
手机接口
public interface IPhoneProduct {
void work();
}
路由器接口
public interface IRouterProduct {
void work();
}
产品的实现类:
public class HuiWeiPhone implements IPhoneProduct {
@Override
public void work() {
System.out.println("华为手机");
}
}
...
产品工厂:
public interface ProductFactory {
IRouterProduct getRouter();
IPhoneProduct getPhone();
}
华为工厂:
public class HuaWeiFactory implements ProductFactory {
@Override
public IRouterProduct getRouter() {
return new HuaWeiRouter();
}
@Override
public IPhoneProduct getPhone() {
return new HuiWeiPhone();
}
}
小米工厂:
public class XiaoMiFactory implements ProductFactory {
@Override
public IRouterProduct getRouter() {
return new XiaoMiRouter();
}
@Override
public IPhoneProduct getPhone() {
return new XiaoMiPhone();
}
}
测试:
public class Main {
public static void main(String[] args) {
new XiaoMiFactory().getPhone().work();
}
}
抽象工厂方法把一个品牌的产品很好的分离开来,添加产品族(一个品牌的所有产品)很方便。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。