设计模式|简单工厂、工厂方法、抽象工厂
2018-10-14 13:46
357 查看
版权声明:本文为博主原创文章,未经允许不得转载。 https://blog.csdn.net/qq_24672657/article/details/83046641
优点
用户只需要关心所需要对象对应的工厂,无需关心创建的细节。
加入新的功能是复合开闭原则,提高扩展性
缺点
增加了系统的抽象性和理解难度
简单工厂
概念
-
定义:
由一个工厂对象决定创建出哪一种产品类的实例
-
类型:
创建型,但不属于GOF23种设计模式
-
使用场景
-
优点
-
缺点
案例一
动物的抽象类
public abstract class Animal { public abstract void eat(); }
public class Cat extends Animal { public void eat() { System.out.println("Cat is eating"); } }
public class Dog extends Animal { public void eat() { System.out.println("Dog is eating"); } }
public class Demo { @Test public void demo1(){ Animal cat = new Cat(); cat.eat(); Animal dog = new Dog(); dog.eat(); } }
缺点:应用层依赖具体的实现类
思路:让应用层不依赖具体的实现类
重构
简单工厂demo1
public class AnimalFactory { public Animal getAnimal(String name){ Animal animal = null; if ("cat".equalsIgnoreCase(name)){ animal = new Cat(); }else if ("dog".equalsIgnoreCase(name)){ animal = new Dog(); } return animal; } }
测试
@Test public void demo2(){ AnimalFactory animalFactory = new AnimalFactory(); Animal cat = animalFactory.getAnimal("cat"); if (cat == null){ return; } cat.eat(); }
缺点:当需要新增一个实现时,需要破坏animalFactory原有的代码,不符合开闭原则。
简单工厂demo2
在AnimalFactory工厂类中,重写getAnimal方法
public Animal getAnimal(Class<Cat> c){ Animal animal = null; try { animal = (Animal) Class.forName(c.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return animal; }
测试
@Test public void demo3(){ AnimalFactory animalFactory = new AnimalFactory(); Animal cat = animalFactory.getAnimal(Cat.class); if (cat == null){ return; } cat.eat(); }
测试成功
工厂方法
概念
- 定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。
- 类型:创建型
- 使用场景 创建对象需要大量重复的代码
- 应用层不依赖与产品类实例如何被创建、实现等细节。
- 一个类通过其子类来指定创建哪个对象
-
类的个数容易过多,增加复杂度
案例二
安装工厂方法的定义,对上面的案例一进行重构
- 将AnimalFactory定义成抽象类,定义一个创建对象的抽象方法。
public abstract class AnimalFactory { public abstract Animal getAnimal(); }
AnimalFactory只是定义一种规范,不定义具体的实现。完全交给子类来实现。
public class CatFactory extends AnimalFactory { public Animal getAnimal() { return new Cat(); } }
public class DogFactory extends AnimalFactory { public Animal getAnimal() { return new Dog(); } }
应用层调用
public class Demo { @Test public void demo4(){ AnimalFactory catFactory = new CatFactory(); Cat cat = (Cat) catFactory.getAnimal(); cat.eat(); } }
这样扩展性增加了。
应用
Collection中的iterator方法
java.util.Collection接口中定义了一个抽象的
iterator()方法,该方法就是一个工厂方法。
对于
iterator()方法来说
Collection就是一个根抽象工厂,下面还有
List等接口作为抽象工厂,再往下有
ArrayList等具体工厂。
java.util.Iterator接口是根抽象产品,下面有
ListIterator等抽象产品,还有
ArrayListIterator等作为具体产品。
使用不同的具体工厂类中的
iterator方法能得到不同的具体产品的实例。
【参考】JDK中的工厂方法模式
阅读更多相关文章推荐
- 设计模式之简单工厂、工厂方法、抽象工厂
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 设计模式-工厂方法 简单工厂 抽象工厂 模板方法
- 设计模式--简单工厂,工厂方法,抽象工厂
- Java 设计模式中,简单工厂、工厂方法、抽象工厂的区别
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- PHP中的设计模式-简单工厂,静态工厂,工厂方法,抽象方法的关系
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别 (转)
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别 (转)
- 设计模式之 简单工厂,工厂方法,抽象工厂
- 设计模式学习之简单工厂、工厂方法、抽象工厂
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别 (转)
- 【设计模式之四:工厂模式对比】简单工厂、工厂方法和抽象工厂的区别
- 【设计模式】全局看 简单工厂 -工厂方法- 抽象工厂
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 茂哥设计模式:简单工厂,工厂方法,抽象工厂
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别 .