创造型模式分类:
- 对象创造型模式:主要完成对象的创建,并将对象中部分内容放到其他对象中创建。
- 类创造型模式:主要完成类实例化,并将类中的部分对象放到子类中创建(高效的利用继承机制)
- 抽象工厂模式:提供一个用于创建相关对象或者相互依赖对象的接口,无需指定对象的具体类
- 生成器模式:将复杂对象的构建与其表示相互分离,使得在同样的构建过程中可以创建不同的对象。
- 原型模式:使用一个原型实例来指定创建对象的种类,然后通过拷贝原型实现对象的创建。
- 单例模式:确保某一个类在系统中只有一个实例,并提供一个访问他的全局访问点。
工厂方法模式示例:日志记录在软件应用系统中是最常用的任务。很多不同的功能模块,可能都需要日志的存储功能。比如文件存取日志,数据库记录日志,控制台记录日志。所有这些模块可以通过一个接口和一个具体的实现类来完成。然后我们可以根据不同模块所需要的不同功能,我们可以创建特定的日志记录对象并实现相关的功能。
工厂方法模式应用方法:假设我们首先需要定义一个用于实现某一个基本功能的超类和接口(产品类);并以此扩展出一组类(具体产品类)。之后我们创建一个用于创建产品类的类(工厂类),这个类包含着一个工厂的方法(这个方法可以接受一个参数或者多个参数)。
工厂方法的作用就是根据传递的参数决定创建哪一个子类完成实例化。
工厂方法模式代码实现:
【产品类】
package create.factory; /** * 实例化工厂类模式基类(产品类) * Created by admin on 2018/11/26. */ public interface Pet { public String petSound(); }
【具体产品类】
package create.factory; /** * 具体产品类 * Created by admin on 2018/11/26. */ public class Dog implements Pet { public String petSound() { return "旺旺"; } } package create.factory; /** * Created by admin on 2018/11/26. */ public class Cat implements Pet{ public String petSound() { return "喵喵"; } }
【工厂模板类】
package create.factory; /** * 工厂方法模式实现,并展示对象创建逻辑 * Created by admin on 2018/11/26. */ public class PetFactory { public Pet getPet(String petType){ Pet pet = null; if ("Bow".equals(petType)) { pet = new Dog(); } else if ("Meaw".equals(petType)) { pet = new Cat(); } return pet; } }
【测试类】
package create.factory; /** * Created by admin on 2018/11/26. */ public class SampleFactoryMethod { public static void main(String[] args) { PetFactory petFactory = new PetFactory(); Pet bow = petFactory.getPet("Bow"); System.out.println(bow.petSound()); } }
工厂模式应用的场景:
当需要创建一个类的时候,而在编程的时候不知道这个类的类型(需要运行的时候才能确定)
当一个类希望由其子类来指定所创建对象的具体类型的时候。
当我们想要定位被创建类,并获取相关信息时候。
示例:日志记录功能
package create.factory2; /** * Created by admin on 2018/11/26. */ public class LoggerFactoryTest { public static void main(String[] args) { LoggerFactory factory = new LoggerFactory(); AppLogger appLogger = factory.getLogger(1); appLogger.log("asda"); } } package create.factory2; /** * Created by admin on 2018/11/26. */ public class LoggerFactory { //工厂方法 public AppLogger getLogger(int value){ if (value == 1) { return new FileLogger(); } else if(value == 2){ return new DatabaseLogger(); } else if (value == 3) { return new ConsoleLogger(); } return null; } } package create.factory2; /** * Created by admin on 2018/11/26. */ public class FileLogger implements AppLogger { public void log(String logMsg) { System.out.println("日志记录文件中"); } } package create.factory2; /** * Created by admin on 2018/11/26. */ public class DatabaseLogger implements AppLogger{ public void log(String logMsg) { System.out.println("日志记录数据库中"); } } package create.factory2; /** * Created by admin on 2018/11/26. */ public class ConsoleLogger implements AppLogger{ public void log(String logMsg) { System.out.println("日志记录控制台"); } } package create.factory2; /** * 日志记录器接口 * Created by admin on 2018/11/26. */ public interface AppLogger { public void log(String logMsg); }