zoukankan      html  css  js  c++  java
  • 设计模式——简单工厂模式,静态工厂模式

    下面我们来看一个场景:

    假如客户需要一辆卡车(car),有的客户需要一辆挖土机(navvy),则我们可以抓住他们的共性,可以run

    可以定义一个Moveable接口

    1 public interface Moveable {
    2     void run();
    3 }
     1 public class Car implements Moveable{
     2     
     3     /*//自己实例化一个静态的Car对象  由于只能产生一个所以也叫单例
     4     private static Car car=new Car();
     5     
     6     public static Car getInstance(){
     7         return car;
     8     }
     9     */
    10     
    11     public void run(){
    12         System.out.println("老司机开车了.....快上车没时间解释了.....");
    13     }
    14 }
    package com.hone.design.singleton;
    
    public class navvy implements Moveable {
    
        @Override
        public void run() {
            System.out.println("快来挖掘机学校吧。。。。。");
        }
    }

    定义一个client类,用于实现客户自己的想法:

     1 public class Client {
     2     public static void main(String[] args) {
     3     
     4         
     5     /*
     6            * 这里面无论再加上什么东西只需要new一个新的对象即可,
     7         */
     8     Moveable moveable=new car();
     9         moveable.run();
    10     }
    11 }
    12         

    如果每次客户需要一辆车,都得自己去制作一辆新的,效率会有多么低啊?因此我们就出现了工厂的概念,能不能每一个工厂都将car  navvy制作好了之后,客户需要了可以自己去拿呢?

    当然是可以额。

    1 public class CarFactory {
    2       //  Car工厂   这里有一个createCar()方法,将制作好的car对象返回回来
    3 
    4     public Moveable createCar(){
    5         return new Car();
    6     }
    1 public class NavvyFactory extends VehicleFactory{
    2     
    3     public Moveable createPlane(){
    4         return new Plane();
    5     }
    6

    client类

     1 public class Client {
     2     public static void main(String[] args) {
     3     
     4         
     5     
     6     /*
     7      * 这里先利用工厂生产车的对象,然后在调用车对象的run方法
     8      */
     9     CarFactory factory=new CarFactory();
    10     Moveable car=factory.createCar();
    11     car.run();

    这里面factory有太多相同的方法,我们在抽象一下,可以不可以将factory定义为一个接口或者一个抽象类呢,让carFactory和NavvyFactory从Factory工厂中继承或者实现呢?

    1 public abstract class VehicleFactory {
    2        //这里的返回值当然是一个Moveable接口的对象
    3     public abstract Moveable create();
    4 
    5 }
    1 public class CarFactory extends VehicleFactory{
    2 
    3     @Override
    4     public Moveable create() {
    5         return new Car();
    6     }
    8 }
    1 public class NavvyFactory extends VehicleFactory{
    2 
    3     @Override
    4     public Moveable create() {
    5         return new navvy();
    6     }
    7 }

    client的实现:

    public class Test {
        public static void main(String[] args) {
        
        //加入我们将工厂对象抽象出来,不必每次都new一个新的工厂对象出来    
        VehicleFactory factory=new NavvyFactory();
        Moveable plane=factory.create();
        plane.run();
            
            
        }
    }

    所以我们可以知道简单工厂是什么东西?

    也就是当我们需要很多有共性的对象的时候,我们可以定义一个抽象的类或者接口,让其他具体的类从里面实现。

    工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。 可以减少代码的冗余。

    1 <html>
    2     <body>
    3         <a href="http://www.cnblogs.com/xiaxj/p/6497564.html">下篇文章,什么是静态代理?</a>
    4     </body>
    5 </html>
  • 相关阅读:
    关于-webkit-border-image的理解
    手机浏览pc网页,字体显示比样式中设置的字体更大
    网页乱码原理
    浏览器的钉点调试的作用
    zepto中的多点触摸
    parentNode和offsetParent的区别,仅仅只是定位相对不一样么
    ckeckbox的默认样式,label for添加toggle后失效,美化checkbox
    当stop()遇到animate()的回调函数
    有联系的标识变量的变化一定要同步
    当relative遇上z-index,半透明度不阻断事件捕获
  • 原文地址:https://www.cnblogs.com/xiaxj/p/6508799.html
Copyright © 2011-2022 走看看