设计模式系列(四)---工厂模式
设计模式系列(四)---工厂模式
目录
工厂模式的种类
- 工厂模式分为两类:工厂方法模式和抽象工厂模式
- 简单工厂是工厂方法模式的一种特例
简单工厂模式
代码实现
abstract class Person
{
public abstract void sayHello();
}
class GDPerson extends Person
{
public void sayHello()
{
System.out.println("我是广东人");
}
}
class BJPerson extends Person
{
public void sayHello()
{
System.out.println("我是北京人");
}
}
class PersonFactory
{
static final int GD=1;
static final int BJ=2;
public static Person createPerson(int area)
{
switch (area)
{
case GD:
return new GDPerson();
case BJ:
return new BJPerson();
default:
return null;
}
}
}
public class Demo5 {
public static void main(String[] args) {
Person gdPerson=PersonFactory.createPerson(PersonFactory.GD);
gdPerson.sayHello();
Person bjPerson=PersonFactory.createPerson(PersonFactory.BJ);
bjPerson.sayHello();
}
}
开放封闭原则
- 开放封闭原则是面向对象原则的核心
- 对扩展开放,意味着需求或变化是们可以对现有代码进行扩展,以适应新的情况
- 对修改封闭,意味这类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改
分析
-
传入要创建的对象的类型,然根据传入的类型,创建相应的对象
-
调用者不必知道对象是如何创建的,只要传入相应的参数就可以
-
但是,如果这个时候需要添加其他的type,那么就要增加case,也就是对设计完成的类进行修改,而这样就违背了开放封闭原则
工厂方法模式
代码实现
public interface PersonFactory
{
Person createPerson();
}
class GDFactory implements PersonFactory
{
public Person createPerson() {
return new GDPerson();
}
}
class BJFactory implements PersonFactory
{
public Person createPerson()
{
return new BJPerson();
}
}
public class Demo5 {
public static void main(String[] args) {
PersonFactory gdFactory=new GDFactory();
Person gdPerson=gdFactory.createPerson();
PersonFactory bjFactory=new BJFactory();
Person bjPerson=bjFactory.createPerson();
}
}
分析
- 定义一个用于创建对象的接口,让子类决定实例化哪个类,在这里体现为创建一个PersonFactory接口,根据要实例化的类(Person的类型),创建实现这个接口的一个工厂类(BJFactory或者是GDFactory)。
- 这样的话,当增加一个新的类的时候,不用对一个已经设计完成的类进行修改,这样就不会破坏开放封闭原则。
- 但是随着类的增多(比如SHPeroson和USAPerson),那么就要对应创建多个工厂类
抽象工厂模式
abstract class Animal
{
public abstract void sayHello();
}
class Cat extends Animal
{
public void sayHello()
{
System.out.println("瞄");
}
}
public interface Factory
{
Person createPerson();
Animal createAnimal();
}
class Factory1 implements Factory
{
public Person createPerson()
{
return new BJPerson();
}
public Animal createAnimal()
{
return new Cat();
}
}
分析
- 对比工厂方法模式。它与工厂方法唯一的区别就是工厂的接口里是不再是创建一个类型(不止是Person还有Animal)。
对比
- 可以体会到,创建一个实例的时候,我们将判断的逻辑放到工程的类的内部(switch或者if else)。而工厂方法模式的话,则是将判断的逻辑转移到客户端,要创建什么类型的实例,就创建对应的工厂来获取对象。
我觉得分享是一种精神,分享是我的乐趣所在,不是说我觉得我讲得一定是对的,我讲得可能很多是不对的,但是我希望我讲的东西是我人生的体验和思考,是给很多人反思,也许给你一秒钟、半秒钟,哪怕说一句话有点道理,引发自己内心的感触,这就是我最大的价值。(这是我喜欢的一句话,也是我写博客的初衷)
作者:jiajun 出处: http://www.cnblogs.com/-new/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。