工厂模式是创建型模式的一种,也是里面需要注意的点最少的一种设计模式。通常来说,工厂模式有简单工厂、工厂方法和抽象工厂三种,其中前两种实现较为简单,后面一种比较复杂,这里先将简单工厂和工厂方法放一起,抽象工厂单独写一篇。
简单工厂简单工厂适用于工厂类型确定的情况,在工厂中通过传入的类型来创建对应的对象。传统的写法如下(以创建各种水果为例): 1.首先定义水果的接口和方法:
public interface Fruit {
String getType();
}
2.定义实现类(这里定义了Circle和Square)
public class Apple implements Fruit{
@Override
public String getType() {
return "apple";
}
}
public class Pear implements Fruit{
@Override
public String getType() {
return "pear";
}
}
3.定义一个跟图形映射的静态常量(非必须,本人习惯,这样可以避免魔鬼字符串,并且方便代码重构)
public interface Type {
String APPLE = "apple";
String PEAR = "pear";
}
4.定义图形工厂
public class FruitFactory {
public static Fruit createFruit(String type) {
if (type.equals(Type.PEAR)) {
return new Pear();
} else if (type.equals(Type.APPLE)) {
return new Apple();
}
return null;
}
}
5.客户端调用
public class Test {
public static void main(String[] args) {
Fruit fruit = FruitFactory.createFruit(Type.APPLE);
System.out.println(fruit.getType());//apple
Fruit fruit1 = FruitFactory.createFruit(Type.PEAR);
System.out.println(fruit1.getType());//pear
}
}
关于简单工厂
简单工厂应该是设计模式中最简单的一种,能满足一部分需求。该工厂最大的一个问题是违反了开闭原则,比如我现在要增加另一种水果,则必须在FruitFactory类中去增加,会修改这个类,我们辛辛苦苦加班写的代码,肯定是不想被别人去修改的。
工厂方法如果简单工厂能满足我们的需求,就没有必要上工厂方法了,因为工厂方法会创建多个工厂,无疑增加了我们的维护成本。对于工厂方法,我们还是以创建水果为例,假设我们的苹果和梨有两种,分别时南方的和北方的,此时我们需要南方水果工厂来创建南方的水果,北方的水果工厂来创建北方的水果。步骤如下: 1.定义水果的接口:
public interface Fruit {
String returnType();
}
2.定义南方和北方苹果和梨,实现Fruit接口
public class NorthApple implements Fruit{
@Override
public String returnType() {
return "apple from north";
}
}
public class NorthPear implements Fruit{
@Override
public String returnType() {
return "pear from north";
}
}
public class SouthApple implements Fruit{
@Override
public String returnType() {
return "apple from south";
}
}
public class SouthPear implements Fruit{
@Override
public String returnType() {
return "pear from south";
}
}
3.定义生产水果的工厂接口
public interface FruitFactory {
Fruit createFruit(String type);
}
4.定义南方和北方的水果工厂,实现FruitFactory
public class NorthFruitFactory implements FruitFactory{
@Override
public Fruit createFruit(String type) {
if (type.equals(Type.APPLE)) {
return new NorthApple();
} else if (type.equals(Type.PEAR)) {
return new NorthPear();
}
return null;
}
}
public class SouthFruitFactory implements FruitFactory{
@Override
public Fruit createFruit(String type) {
if (type.equals(Type.APPLE)) {
return new SouthApple();
} else if (type.equals(Type.PEAR)) {
return new SouthPear();
}
return null;
}
}
5.客户端调用
public class Test {
public static void main(String[] args) {
FruitFactory fruitFactory = new SouthFruitFactory();
Fruit fruit = fruitFactory.createFruit(Type.APPLE);
System.out.println(fruit.returnType());//apple from south
System.out.println("-----------------------------");
FruitFactory fruitFactory1 = new NorthFruitFactory();
Fruit fruit1 = fruitFactory1.createFruit(Type.PEAR);
System.out.println(fruit1.returnType());//pear from north
}
}
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved