s186

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

工厂方法模式(定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行)
工厂方法模式是对简单工厂模式的进一步抽象化,可以使系统在不修改原来代码的情况下引进新的产品,满足开闭原则。
优点:
1、用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

缺点:
1、每次增加一个产品时,都需要增加一个具体产品类和具体工厂类,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度
2、抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决

例子:以工厂生产华为手机和苹果手机为例,类图如下:
————————————————
D%L8CD3IK~NYGGV5U{_TUMI.png
工厂方法模式的主要角色如下
抽象工厂(Abstract Factory):提供创建实体对象的接口。
具体工厂(Concrete Factory):实现抽象工厂中创建实体对象的接口。
抽象产品(Abstract Product):为具体产品提供公共接口。
具体产品(Concrete Product):实现抽象产品所定义的接口,由具体工厂来创建,和具体工厂相对应。

代码实现如下

/**
 * 抽象工厂
 */
public interface Factory {
    // 生产手机
    Phone produce();
}

具体工厂

/**
 * 华为工厂
 */
public class HuaweiFactory implements Factory {
    @Override
    public Phone produce() {
        System.out.println("新华为手机");
        return new HuaweiPhone();
    }
}
/**
 * 苹果工厂
 */
public class AppleFactory implements Factory {
    @Override
    public Phone produce() {
        System.out.println("新苹果手机");
        return new ApplePhone();
    }
}

抽象产品

/**
 * 手机
 */
public interface Phone {
    // 打电话
    void call();
}

具体产品

/**
 * 华为手机
 */
public class HuaweiPhone implements Phone {
    @Override
    public void call() {
        System.out.println("用华为手机打电话...");
    }
}
/**
 * 苹果手机
 */
public class ApplePhone implements Phone {
    @Override
    public void call() {
        System.out.println("用苹果手机打电话...");
    }
}

测试

public class Test {
    public static void main(String[] args) {
        Factory huaweiFactory = new HuaweiFactory();
        Phone huaweiPhone = huaweiFactory.produce();
        huaweiPhone.call();
        Factory appleFactory = new AppleFactory();
        Phone applePhone = appleFactory.produce();
        applePhone.call();
    }
}
// 运行结果
新华为手机
用华为手机打电话...
新苹果手机
用苹果手机打电话...

posted on 2023-06-01 16:15  186的博客  阅读(24)  评论(0)    收藏  举报