标签:com rgs 方法 品种 div factory 创建对象 eth style
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到了其子类。
抽象工厂角色:是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。
具体工厂角色:实现抽象工厂接口的具体工厂类,用于创建具体产品对象。
抽象产品角色:具体产品对象的共同父类或共同拥有的接口。
具体产品角色:实现抽象产品接口的具体产品类,包含产品的具体细节。
汽车(抽象产品)
/** * 抽象产品 */ public interface Car { void showSlogan(); }
具体的汽车
/** * 奥迪车(具体产品) */ public class AudiCar implements Car { @Override public void showSlogan() { System.out.println("伟大,不是成就,而是经历。奥迪Q7!"); } } /** * 奔驰车(具体产品) */ public class BenZCar implements Car { @Override public void showSlogan() { System.out.println("全新梅赛德斯-奔驰GLE SUV,万千气象,纵横无疆。"); } } /** * 宝马车(具体产品) */ public class BMWCar implements Car { @Override public void showSlogan() { System.out.println("便捷畅享BMW之悦,让纯粹驾驶乐趣.时刻在您身边"); } }
汽车工厂(抽象工厂)
/** * 汽车工厂(抽象工厂) */ public interface CarFactory { Car ProduceCar(); }
具体的工厂
/** * 奥迪工厂,生产奥迪车 */ public class AudiCarFactory implements CarFactory { @Override public Car ProduceCar() { return new AudiCar(); } } /** * 奔驰工厂,生产奔驰车 */ public class BenZCarFactory implements CarFactory { @Override public Car ProduceCar() { return new BenZCar(); } } /** * 宝马工厂,生产宝马车 */ public class BMWCarFactory implements CarFactory { @Override public Car ProduceCar() { return new BMWCar(); } }
客户端代码
public class Client { public static void main(String[] args) { //奔驰车工厂,生产奔驰车 BenZCarFactory benzCarFactory = new BenZCarFactory(); Car benzCar = benzCarFactory.ProduceCar(); benzCar.showSlogan(); //宝马车工厂,生产宝马车 BMWCarFactory bmwCarFactory = new BMWCarFactory(); Car bmwCar = bmwCarFactory.ProduceCar(); bmwCar.showSlogan(); //奥迪车工厂,生产奥迪车 AudiCarFactory audiCarFactory = new AudiCarFactory(); Car audiCar = audiCarFactory.ProduceCar(); audiCar.showSlogan(); } }
优点:
1.与简单工厂模式相比,工厂方法模式减轻了工厂类的负担,把某一类产品交由一个工厂生产,不同的工厂生产不同类别的产品。
2.遵守了开闭原则。增加某一类产品时并不需要修改工厂类,只需要添加生产这类产品的工厂即可。
缺点:
随着产品种类的数量的增长,工厂类也会随之增加,将不利于系统的维护。
标签:com rgs 方法 品种 div factory 创建对象 eth style
原文地址:https://www.cnblogs.com/rouqinglangzi/p/11122106.html