zoukankan      html  css  js  c++  java
  • 设计模式(4)---工厂方法模式

    1.简单工厂模式(simple factory)

       简单工厂模式属于创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

    1 package SimpleFactory;
    2 
    3 public abstract class Animal {
    4 
    5     public abstract void eat();
    6 
    7 }
     1 package SimpleFactory;
     2 
     3 public class Dog extends Animal{
     4 
     5     public Dog() {
     6         
     7     }
     8 
     9     @Override
    10     public void eat() {
    11         System.out.println("狗吃肉");    
    12     }
    13     
    14 }
     1 package SimpleFactory;
     2 
     3 public class Cat extends Animal{
     4 
     5     public Cat() {
     6     }
     7 
     8     @Override
     9     public void eat() {
    10         System.out.println("猫吃鱼");    
    11     }
    12     
    13 }
     1 package SimpleFactory;
     2 
     3 public class AnimalFactory {
     4 
     5     private AnimalFactory() {
     6 
     7     }
     8     
     9     public static Animal createAnimal(String type){
    10         if ("dog".equals(type)){
    11             return new Dog() ;
    12         }else if ("cat".equals(type)){
    13             return new Cat() ;
    14         }
    15         return null;
    16     }
    17 
    18 }
     1 package SimpleFactory;
     2 
     3 public class Test {
     4 
     5     public Test() {
     6         
     7     }
     8     
     9     public static void main(String[] args) {
    10         Animal a = AnimalFactory.createAnimal("dog") ;
    11         a.eat();
    12         a = AnimalFactory.createAnimal("cat") ;
    13         a.eat();
    14     }
    15 
    16 }

    优点:客户端不再负责对象的创建,从而明确了各个类的职责。

    缺点:如果有新的产品类增加,要修改工厂类,不利于后期维护,违反了开闭原则。

     

     

    2.工厂方法模式 Factory Method (创建型模式)

     

    意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的实例化延迟到其子类。

    4. 适用性
    在下列情况下可以使用 Factory Method模式:
    • 当一个类不知道它所必须创建的对象的类的时候。
    • 当一个类希望由它的子类来指定它所创建的对象的时候。
    • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类
    是代理者这一信息局部化的时候。

    1 package Factory;
    2 
    3 public interface Animal {
    4      public void eat();
    5 }
     1 package Factory;
     2 
     3 public class Dog implements Animal {
     4 
     5     @Override
     6     public void eat() {
     7         System.out.println("狗吃肉");
     8 
     9     }
    10 
    11 }
     1 package Factory;
     2 
     3 public class Cat implements Animal {
     4 
     5     @Override
     6     public void eat() {
     7         System.out.println("猫吃鱼");
     8     }
     9 
    10 }
    1 package Factory;
    2 
    3 public interface Factory {
    4     public Animal createAnimal();
    5 }
     1 package Factory;
     2 
     3 public class CatFactory implements Factory {
     4 
     5     public CatFactory() {
     6         // TODO Auto-generated constructor stub
     7     }
     8 
     9     @Override
    10     public Animal createAnimal() {
    11         // TODO Auto-generated method stub
    12         return new Cat();
    13     }
    14 
    15 }
     1 package Factory;
     2 
     3 public class DogFactory implements Factory {
     4 
     5     public DogFactory() {
     6         // TODO Auto-generated constructor stub
     7     }
     8 
     9     @Override
    10     public Animal createAnimal() {
    11         
    12         return new Dog();
    13     }
    14 
    15 }
     1 package Factory;
     2 
     3 public class Test {
     4 
     5     public Test() {
     6         // TODO Auto-generated constructor stub
     7     }
     8     
     9     public static void main(String[] args) {
    10         Factory f = new DogFactory() ;
    11         Animal a = f.createAnimal();
    12         a.eat();
    13         
    14         f = new CatFactory() ;
    15         a = f.createAnimal() ;
    16         a.eat();
    17     }
    18 
    19 }

    优点:如果有新的对象增加,只要增加一个具体的类和具体的工厂类即可,不影响原有的代码,提高了系统的维护性和可扩展性。

    缺点:需要额外的代码。

  • 相关阅读:
    Gym
    struts2.5 使用感叹号和通配符实现动态方法调用无效的问题及解决!
    Offfice 多重版本key残留并存的异常问题
    IDEA Struts2 truts-default显红的解决办法
    Struts2的库在 IDEA 的外联库就会报错,不知道为什么。
    计算机二级python 知识点篇(第三方库)
    计算机二级python 知识点篇(python标准库)
    计算机二级python 知识点篇(内置函数整理)
    计算机二级python 知识点篇(文件和数据格式化)
    计算机二级python 知识点篇(组合数据类型)
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/5731107.html
Copyright © 2011-2022 走看看