传统创建对象,都是在客户端,通过A a=new A()的方式创建对象。现在可以将创建的职责转交给工厂类负责。
工厂模式主要有3种,一是简单工厂模式,二是工厂方法模式,三是抽象方法模式。这篇文章主要讲解简单工厂模式。
package cn.itcast_01; /** * * 这是一个抽象类 * 里面有一个吃的功能 * */ public abstract class Animal { public abstract void eat(); } package cn.itcast_01; public class Dog extends Animal { @Override public void eat() { // TODO Auto-generated method stub System.out.println("狗吃骨头"); } } package cn.itcast_01; public class Pig extends Animal { @Override public void eat() { // TODO Auto-generated method stub System.out.println("猪吃饲料"); } } package cn.itcast_01; /** * * 提供一个动物工厂类 * */ public class AnimalFactory { private AnimalFactory(){} /* * 写一个功能,返回一个Dog对象即可 * */ // public static Dog createDog(){ // //即使这个里面的创建对象很复杂,但是也不需要客户端来管理。 // //这些复杂的事情都在工厂里给做好了 // return new Dog(); // } // public static Pig createPig(){ // //即使这个里面的创建对象很复杂,但是也不需要客户端来管理。 // //这些复杂的事情都在工厂里给做好了 // return new Pig(); // } /**根据不同类型的字符串,来创建不同的对象 * * */ public static Animal createAnimal(String type){ if("pig".equals(type)){ return new Pig(); }else if("dog".equals(type)){ return new Dog(); } return null; } } package cn.itcast_01; public class AnimalTest { public static void main(String[] args) { // Pig p=AnimalFactory.createPig(); // p.eat(); // // Dog d=AnimalFactory.createDog(); // d.eat(); // 我们不能把父亲赋值给儿子。 // 但是我们可以把儿子赋值给父亲。多态 Animal a = AnimalFactory.createAnimal("dog"); a.eat(); a = AnimalFactory.createAnimal("pig"); a.eat(); // 开发中,针对对象,我们一般判断是否为null,如果不为null,才使用 a = AnimalFactory.createAnimal("cat"); if (a != null) { a.eat(); } } }
1.简单工厂模式
我现在有一个动物的继承体系
Animal
所有的动物都要吃饭
|--Pig
|--Dog
当创建对象比较简单的时候,我们就可以直接在main方法里面做了,但是,很多时候,创建对象可能还需要做一些初始化,也就是说创建对象的操作会比较复杂,这个时候,如果所有对象的创建工作我们还是在main里面就不太合适,怎么解决这个问题呢?
简单工厂优点和缺点:
对象的创建比较复杂的时候,就考虑使用工厂来实现
优点:再简单工厂模式中,客户端不再负责对象的创建,而把这个责任交给了工厂类
客户端只负责对象的调用,从而明确了各个类的职责。(单一职责)
缺点:由于这个工厂类负责所有对象的创建,那么,当子类不断增多的时候,我们就需要去修改这个工厂的代码,这样呢,就违反一个原则:开闭原则。
这个时候怎么办呢
这个时候就用工厂方法模式改进。