1.设计模式:40
设计模式是一种可重复使用的解决方案。
●GoF(GangofFour),中文名-四人组。
●《DesignPatterns:ElementsofReusableObject-OrientedSoftware》(即《设计模式》一书),1995年,ErichGamama、RichardHelm、RalphJohnson与JohnVlissides合并。这些作者经常被称为“四人组”(GangofFour)"。
●这本书描述了23种设计模式。我们通常所说的设计模式是指这23种设计模式。
●但除GoF23设计模式外,还有JavaEE设计模式(DAO模式、MVC模式等)。
2.GoF23设计模式可分为402.1创建型(5)三类:解决对象创建的问题。■单例模式
■工厂方法模式
■抽象工厂模式
■建造者模式
■原型模式
2.2结构型(7):一些类或对象组合在一起的经典结构。■代理模式
■装饰模式
■适配器模式
■组合模式
■享元模式
■外观模式
■桥接模式
2.3行为型(11):解决类或对象之间的互动问题。■策略模式
■模板方法模式
■责任链模式
■观察者模式
■迭代子模式
■命令模式
■备忘录模式
■状态模式
■访问者模式
■中介者模式
■解释器模式
●工厂模式是为了解决对象创建的问题,因此工厂模式属于创建设计模式。为什么要在这里学习工厂模式?这是因为Spring框架底部使用了大量的工厂模式。
403.1工厂模式通常有三种形式:●第一种:工厂模式简单(SimpleFactory):不属于23种设计模式之一。工厂模式简单又叫做:静态工厂方法模式。工厂模式简单是工厂方法模式的一种特殊实现。
●二是工厂方法模式(FactoryMethod):是23种设计模式之一。
●第三种:抽象工厂模式(AbstractFactory):是23种设计模式之一。
4.简单的工厂模式401.简单的工厂模式是工厂方法模式的特殊实现,又称静态工厂方法模式。span>
4.1简单的工厂模式解决了哪些问题?41优点:客户端程序不需要关心对象的创建细节,需要哪个对象,只需要向工厂要求,初步实现责任的分离。
客户只负责“消费”,工厂负责“生产”。分离生产和消费。
4.2简单的工厂模式有三个角色:41●抽象产品角色
●具体的产品角色
●工厂类角色
简单工厂模式的代码如下:
抽象产品角色:com.powernode.simple.factory抽象Weaponpackage com.powernode.simple.factory;///抽象///抽象产品角色 41public abstract class Weapon { /** * 所有武器都可以攻击。 */ public abstract void attack();}
具体产品角色com.powernode.simple.factoryTankpackage com.powernode.simple.factory;/** * 具体的产品角色 41 **/public class Tank extends Weapon{ @Override public void attack() { System.out.println("坦克开枪!!!!"); }}
Fighterpackage com.powernode.simple.factory;/** * 具体的产品角色 41 **/public class Fighter extends Weapon{ @Override public void attack() { System.out.println(”战斗机离开了小男孩!!!!!"); }}
Daggerpackage com.powernode.simple.factory;/** * 具体的产品角色 41 **/public class Dagger extends Weapon{ @Override public void attack() { System.out.println("砍丫!!!!"); }}
工厂角色com.powernode.simple.factoryWeaponFactorypackage com.powernode.simple.factory;/** * 工厂类角色 41 **/public class WeaponFactory { /** * 静态方法。获得什么产品?这取决于你传输的参数,传输TANK获取坦克,传输DAGGER获取匕首,传输FIGHTER获取战斗机 * 在简单的工厂模式中有一种静态方法,因此被称为静态工厂模式。 * @param weaponType * @return */ public static Weapon get(String weaponType){ if ("TANK".equals(weaponType)) { return new Tank(); } else if ("DAGGER".equals(weaponType)) { return new Dagger(); } else if ("FIGHTER".equals(weaponType)) { return new Fighter(); } else { throw new RuntimeException(“不支持武器的生产”); } }}
测试com.powernode.simple.factoryTestpackage com.powernode.simple.factory;/** * 这是客户端程序 测试的41 **/public class Test { public static void main(String[] args) { // 需要坦克 // 对于我的客户端,我不需要关心坦克的生产细节。我只需要向工厂索要。 // 什么是简单的工厂模式? // 什么是简单的工厂模式?职责分离。客户不需要关心产品的生产细节。 // 客户端只负责消费。工厂负责生产。一个负责生产,一个负责消费。生产者与消费者分离。这就是简单工厂模式的作用。 Weapon tank = WeaponFactory.get("TANK"); tank.attack(); // 需要匕首 Weapon dagger = WeaponFactory.get("DAGGER"); dagger.attack(); // 需要战斗机 Weapon fighter = WeaponFactory.get("FIGHTER"); fighter.attack(); }}
4.3简单工厂模式的缺点?41缺点一:假设需要扩展新产品,需要修改WeaponFactory工厂代码,这显然违反了OCP原则。
缺点二:工厂责任重大,不能有问题,因为这个工厂负责所有产品的生产,叫全能,或者有人称之为上帝。
一旦这个工厂出了问题,整个系统就会瘫痪。(不要把所有的鸡蛋都放在篮子里。)