设计模式-创建型-工厂模式

设计模式-创建型-工厂模式

首页休闲益智图形工厂更新时间:2024-05-11
简介

工厂模式是创建型模式的一种,也是里面需要注意的点最少的一种设计模式。通常来说,工厂模式有简单工厂、工厂方法和抽象工厂三种,其中前两种实现较为简单,后面一种比较复杂,这里先将简单工厂和工厂方法放一起,抽象工厂单独写一篇。

简单工厂

简单工厂适用于工厂类型确定的情况,在工厂中通过传入的类型来创建对应的对象。传统的写法如下(以创建各种水果为例): 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