工厂方法模式(定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行)
工厂方法模式是对简单工厂模式的进一步抽象化,可以使系统在不修改原来代码的情况下引进新的产品,满足开闭原则。
优点:
1、用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
缺点:
1、每次增加一个产品时,都需要增加一个具体产品类和具体工厂类,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度
2、抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决
例子:以工厂生产华为手机和苹果手机为例,类图如下:
————————————————
工厂方法模式的主要角色如下
抽象工厂(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();
}
}
// 运行结果
新华为手机
用华为手机打电话...
新苹果手机
用苹果手机打电话...
标签:Factory,工厂,Phone,产品,手机,方法,public
From: https://www.cnblogs.com/s186/p/17449397.html