zoukankan      html  css  js  c++  java
  • 静态工厂模式、工厂方法模式、抽象工厂方法模式

     

    静态工厂模式

    Animal

    public  abstract class Animal {

    public abstract void call();


    public static class Dog extends Animal {

    @Override
    public void call() {
    System.out.println("Dog");

    }
    }

    public static class Cat extends Animal {
    @Override
    public void call() {
    System.out.println("Cat");
    }
    }

    }

    Factory

    public class Factory {

    public int Type_Dog=0;
    public int Type_Cat=1;

    public static Animal readAnimal(int Type){
    switch (Type){
    default:
    return new Animal.Dog();
    case 0:
    return new Animal.Dog();
    case 1:
    return new Animal.Cat();

    }

    }

    public static void main(String[] args){
    Animal animal=Factory.readAnimal(1);
    animal.call();

    }
    }

     控制台输出:Cat

     

    工厂方法模式

     

    Factory

    public interface Factory {
    void onCall();

    public class Dog implements Factory {

    @Override
    public void onCall() {
    System.out.println("Dog");
    }
    }

    public class Cat implements Factory {

    @Override
    public void onCall() {
    System.out.println("Cat"); }
    }

    }

    ChooseFactory
    public interface ChooseFactory {
    public Factory factory();


    public class ChooseDog implements ChooseFactory{

    @Override
    public Factory factory() {
    return new Factory.Dog();
    }
    }

    public class ChooseCat implements ChooseFactory{

    @Override
    public Factory factory() {
    return new Factory.Cat();
    }
    }

    }

    Animal
    public class Animal {

    public static void main(String[] args){
    ChooseFactory DogFactory=new ChooseFactory.ChooseDog();
    DogFactory.factory().onCall();
    ChooseFactory CatFactory=new ChooseFactory.ChooseCat();
    CatFactory.factory().onCall();

    }
    }

    控制台输出:Dog
    Cat


    抽象工厂模式

    Factory

    public class Factory {

    public interface Factory_Tiger{
    void call();}

    public interface Factory_Doger{
    void call();}


    public static class Dog implements Factory_Tiger {
    @Override
    public void call() {
    System.out.println("Dog"); }}

    public static class Cat implements Factory_Doger {
    @Override
    public void call() {
    System.out.println("Cat");
    }
    }
    }

    ChooseFactory
    public interface ChooseFactory {
    public Factory.Dog build_dog();
    public Factory.Cat build_Tiger();

    public static class BuildFactory implements ChooseFactory {

    @Override
    public Factory.Dog build_dog() {
    return new Factory.Dog();
    }

    @Override
    public Factory.Cat build_Tiger() {
    return new Factory.Cat();
    }
    }

    }


    Animal
    public  class Animal {

    public static void main(String[] args){
    ChooseFactory factory=new ChooseFactory.BuildFactory();
    factory.build_dog().call();
    factory.build_Tiger().call();

    }

    }

    控制台输出:Dog
    Cat

     
    Effective+Java作者joshua bloch(Java 集合框架创办人、谷歌首席java架构师)建议,考虑用静态工厂方法来代替多个构造函数。

    第一个优点,有名称,有时候一个类的构造器不止一个,名称往往相同,参数不同,很难理解他们有什么不同的含义,如果使用静态工厂方法,就一目了然知道设计者想表达的意图。

    第二个优点,不用重复创建一个对象。

    第三个优点,可以返回类型的任何子类型.举个例子,

       List list = Collections.synchronizedList(new ArrayList()) 

      这个例子就说明了可以返回原返回类型的任何子类型的对象。

       缺点:1.公有的静态方法所返回的非公有类不能被实例化,也就是说Collections.synchronizedList返回的SynchronizedList不能被实例化。

                 2.查找API比较麻烦,它们不像普通的类有构造器在API中标识出来,在文档中要详细说明实例化一个类,非常困难。

     
  • 相关阅读:
    常用sql(转)
    dos
    VS调试 DataTable (转载)
    JS 对象 数组求并集,交集和差集
    js跳出循环的方法区别(break,continue,return)(转载)
    echarts 曲线平滑配置
    js 动态 批量 创建局部或全局变量 (转载)
    电脑 闪屏 无法启动的原因
    js switch case 判断的是绝对相对===,值和类型都要相等
    无法创建“匿名类型”类型的常量值。此上下文仅支持基元类型或枚举类型。
  • 原文地址:https://www.cnblogs.com/neowu/p/10741316.html
Copyright © 2011-2022 走看看