0 - 前言
简单工厂, 工厂方法, 抽象工厂都是创建型的设计模式, 三个设计模式都是工厂的变种, 不复杂, 下面我们来快速学习这三种;
1 - 简单工厂模式
太简单, UML 图就不画了, 直接上代码:
- //-----------------1, 简单工厂 ------------
- //1-1, 生产者父类
- class PhoneMaker
- {
- public void getPhone(){}
- }
- //1-2, 具体生产者
- class IphoneMaker extends PhoneMaker
- {
- @Override
- public void getPhone()
- {
- System.out.println("生产出了苹果手机");
- }
- }
- class HuaweiMaker extends PhoneMaker
- {
- @Override
- public void getPhone()
- {
- System.out.println("生产出了华为手机");
- }
- }
- //1-3 工厂
- class PhoneFactory
- {
- public PhoneMaker makePhone(int phoneType)
- {
- PhoneMaker pm = null;
- switch (phoneType)
- {
- case 1:
- pm=new IphoneMaker();
- break;
- case 2:
- pm=new HuaweiMaker();
- break;
- default :
- break;
- }
- return pm;
- }
- }
客户端:
- //1, 简单工厂模式
- PhoneFactory pf=new PhoneFactory();
- PhoneMaker pm = pf.makePhone(1);
- pm.getPhone();
优缺点:
优点
(1)简单工厂包含必要的判断逻辑, 简单工厂实现了对象的创建和使用的分离.
(2)客户端无需知道所创建的具体产品类的类名, 只需要具体产品类对应的参数即可!
(3)在不修改任何客户端代码的情况下更换和增加新的具体产品类, 在一定程度上提高了系统的灵活性
缺点
(1)工厂类的职责过重, 包含逻辑判断语句, 它一旦有问题, 整个系统都要出问题 (2) 在添加新的类的时候, 简单工厂类就要修改, 违反了开放 -- 封闭原则!
2 - 工厂方法模式
同样, 直接上代码:
- //----------------2, 工厂方法模式 ---------------------
- // 生产者接口
- interface ITVMaker
- {
- void getTV();
- }
- // 工厂接口
- interface ITVFactory
- {
- ITVMaker getTVMaker();
- }
- //----------------
- // 具体生产者
- class AppleTVMaker implements ITVMaker
- {
- @Override
- public void getTV()
- {
- System.out.println("生产出了苹果电视");
- }
- }
- class HuaweiTVMaker implements ITVMaker
- {
- @Override
- public void getTV()
- {
- System.out.println("生产出了华为电视");
- }
- }
- // 具体工厂
- class AppleTVFactory implements ITVFactory
- {
- @Override
- public ITVMaker getTVMaker()
- {
- return new AppleTVMaker();
- }
- }
- class HuaweiTVFactory implements ITVFactory
- {
- @Override
- public ITVMaker getTVMaker()
- {
- return new HuaweiTVMaker();
- }
- }
客户端:
- //2, 工厂方法模式
- // 如果要苹果电视
- ITVFactory tvf = new AppleTVFactory();
- ITVMaker tvm = tvf.getTVMaker();
- tvm.getTV();
- // 如果要华为电视
- // ITVFactory tvf = new HuaweiTVFactory();
优缺点:
优点:
(1)工厂方法用来创建客户所需要的产品, 同时隐藏了哪种具体产品类将被实例化的细节, 用户只需要要关注工厂, 不需要关注创建的细节!
(2)在增加修改新的产品的时候不用修改代码, 只需要增加对应的工厂就好, 完全符合开放 -- 封闭性原则!
(3)创建对象的细节完全封装在具体的工厂内部, 而且有了抽象的工厂类, 所有的具体工厂都继承了自己的父类! 完美的体现了多态性!
缺点:
(1)在增加新的产品时, 也必须增加新的工厂类, 会带来额外的开销
3 - 抽象工厂模式
同样, 直接上代码:
- //--------------------3, 抽象工厂模式 --------------
- // 产品接口
- class BookMaker // 产品 1
- {
- public void makeBook()
- {}
- }
- class PenMaker // 产品 2
- {
- public void makePen()
- {}
- }
- // 工厂接口
- interface IstudentFactory
- {
- BookMaker CreateBookmaker();
- PenMaker CreatPenkmaker();
- }
- //------ 实现具体产品
- class MinBookMaker extends BookMaker
- {
- @Override
- public void makeBook()
- {
- System.out.println("生产了小学课本");
- }
- }
- class MinPenMaker extends PenMaker
- {
- @Override
- public void makePen()
- {
- System.out.println("生产了小学生用的笔");
- }
- }
- // ..... 产品 1234...
- // 具体工厂
- class MinStudentFactory implements IstudentFactory
- {
- @Override
- public BookMaker CreateBookmaker()
- {
- return new MinBookMaker();
- }
- @Override
- public PenMaker CreatPenkmaker()
- {
- return new MinPenMaker();
- }
- }
- //...... 工厂 1234.....
客户端:
- //3, 抽象工厂
- IstudentFactory factory = new MinStudentFactory(); // 生产小学生的产品系列
- BookMaker bookMaker = factory.CreateBookmaker();
- PenMaker penMaker =factory.CreatPenkmaker();
- bookMaker.makeBook();
- penMaker.makePen();
- //... 生产中学生的系列产品.....
- // IstudentFactory factory = new MiddleStudentFactory();
- //----- 3.1 以下是配合反射的抽象工厂 ------
- String studentType="Min";
- try
- {
- // Class<?> c =Class.forName(this.getClass().getPackage().getName() + studentType + "StudentFactory");
- Class<?> c =Class.forName("com.anson.designpattern.designPattern.MinStudentFactory");
- IstudentFactory studentFactory = (IstudentFactory)c.newInstance();
- BookMaker bookMaker1 = studentFactory.CreateBookmaker();
- PenMaker penMaker1 =studentFactory.CreatPenkmaker();
- bookMaker1.makeBook();
- penMaker1.makePen();
- }
- catch (Exception e)
- {
- System.out.println(e);
- }
优缺点:
增加一个产品族很简单, 而增加一个新的产品就会非常复杂!
4 - 一句话总结
简单工厂 : 用来生产同一等级结构中的任意产品.(对于增加新的产品, 无能为力)
工厂方法 : 用来生产同一等级结构中的固定产品.(支持增加任意产品)
抽象工厂 : 用来生产不同产品族的全部产品.(对于增加新的产品, 无能为力; 支持增加产品族)
来源: https://www.cnblogs.com/yanghj/p/13408679.html