自己的第一篇文章,有点小激动!话不多说,直接进入主题,这是我java入门后学习的第一个设计模式-简单工厂模式。
- 首先,我们要了解什么是设计模式?
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。总共有 23 种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。
- 简单工厂模式就是属于创建型模式的一种,那什么又是创建型模式呢?
创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。(就是在你设计这个程序的的时候尽量少在主程序里面去new,实例化对象)
下面就举一个例子来简单说明一下简单工厂模式。
有一个披萨店,可以订购披萨,披萨有很多的种类(苹果、香蕉…),不同类型的披萨制作时会用到不同的原料,制作完成后就打包。
一般向我这种刚入门的小白完成这个项目的时候,会直接在主程序里写业务的步骤:
披萨商店:
import java.util.Scanner;
public class PizzaShop {
public static void main(String[] args) {
Pizza pizza=null;
String type;
do {
type=getType();
if ( "苹果披萨".equals(type) ){
pizza=new ApplePizza();
pizza.setName("苹果披萨");
}else if ( "香蕉披萨".equals(type) ){
pizza=new BananaPizza();
pizza.setName("香蕉披萨");
}else {
break;
}
pizza.prepare();
pizza.making();
pizza.boxing();
}while (true);
}
public static String getType(){
System.out.println("请输入需要订购的披萨类型:");
Scanner sc=new Scanner(System.in);
String result=sc.nextLine();
return result;
}
}
Pizza类:
public abstract class Pizza {
protected String name;
public Pizza() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void prepare();
public void making(){
System.out.println(name+"制作中...");
}
public void boxing(){
System.out.println(name+"制作完成,装盒中...");
System.out.println("装盒完毕!");
}
}
class ApplePizza extends Pizza{
@Override
public void prepare() {
System.out.println("为苹果披萨准备原料!");
}
}
class BananaPizza extends Pizza{
@Override
public void prepare() {
System.out.println("为香蕉披萨准备原料!");
}
}
向上面这样写代码虽然让我们比较容易理解项目,但是会违反开闭原则(对扩展开放,对修改关闭),所以就此引入简单工厂模式,通过一个SimpleFactory类来完成。
Pizza简单工厂类:
import java.util.Scanner;
public class PizzaShop {
public static void main(String[] args) {
Pizza pizza=null; //初始化pizza
String type; //定义pizza类型
//简单工厂模式
type=getType();
pizza=SimpleFactory.createPizza( type );
pizza.prepare();
pizza.making();
pizza.boxing();
public static String getType(){
System.out.println("请输入需要订购的披萨类型:");
Scanner sc=new Scanner(System.in);
String result=sc.nextLine();
return result;
}
}
public class SimpleFactory {
public static Pizza createPizza( String type ){
System.out.println("简单工厂模式");
Pizza pizza=null;
if ( "苹果披萨".equals(type) ){
pizza=new ApplePizza();
pizza.setName("苹果披萨");
}else if ( "香蕉披萨".equals(type) ){
pizza=new BananaPizza();
pizza.setName("香蕉披萨");
}
return pizza;
}
}
这样以后我们要添加或删除披萨种类的时候就能够不用再主程序里修改了,只需要再简单工厂里进行修改就行了。
试一下添加一个草莓披萨,先在pizza类里加一个草莓披萨类,再修改简单工厂里的,之后测试一下。
class strawberryPizza extends Pizza{
@Override
public void prepare() {
System.out.println("为草莓披萨准备原料!");
}
}
public class SimpleFactory {
public static Pizza createPizza( String type ){
System.out.println("简单工厂模式");
Pizza pizza=null;
if ( "苹果披萨".equals(type) ){
pizza=new ApplePizza();
pizza.setName("苹果披萨");
}else if ( "香蕉披萨".equals(type) ){
pizza=new BananaPizza();
pizza.setName("香蕉披萨");
}else if ( "草莓披萨".equals(type) ){
pizza=new BananaPizza();
pizza.setName("草莓披萨");
}
return pizza;
}
}
在JDK中也有关于简单工厂模式的应用(Calendar.getInstance())